OSDN Git Service

* cp-tree.h (cp_build_function_call_nary): Declare.
[pf3gnuchains/gcc-fork.git] / gcc / cp / typeck.c
1 /* Build expressions with type checking for C++ compiler.
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5    Hacked by Michael Tiemann (tiemann@cygnus.com)
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23
24 /* This file is part of the C++ front end.
25    It contains routines to build C++ expressions given their operands,
26    including computing the types of the result, C and C++ specific error
27    checks, and some optimization.  */
28
29 #include "config.h"
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include "tree.h"
34 #include "cp-tree.h"
35 #include "flags.h"
36 #include "output.h"
37 #include "toplev.h"
38 #include "diagnostic.h"
39 #include "intl.h"
40 #include "target.h"
41 #include "convert.h"
42 #include "c-common.h"
43 #include "params.h"
44
45 static tree pfn_from_ptrmemfunc (tree);
46 static tree delta_from_ptrmemfunc (tree);
47 static tree convert_for_assignment (tree, tree, const char *, tree, int,
48                                     tsubst_flags_t, int);
49 static tree cp_pointer_int_sum (enum tree_code, tree, tree);
50 static tree rationalize_conditional_expr (enum tree_code, tree, 
51                                           tsubst_flags_t);
52 static int comp_ptr_ttypes_real (tree, tree, int);
53 static bool comp_except_types (tree, tree, bool);
54 static bool comp_array_types (const_tree, const_tree, bool);
55 static tree pointer_diff (tree, tree, tree);
56 static tree get_delta_difference (tree, tree, bool, bool);
57 static void casts_away_constness_r (tree *, tree *);
58 static bool casts_away_constness (tree, tree);
59 static void maybe_warn_about_returning_address_of_local (tree);
60 static tree lookup_destructor (tree, tree, tree);
61 static void warn_args_num (location_t, tree, bool);
62 static int convert_arguments (tree, VEC(tree,gc) **, tree, int,
63                               tsubst_flags_t);
64
65 /* Do `exp = require_complete_type (exp);' to make sure exp
66    does not have an incomplete type.  (That includes void types.)
67    Returns the error_mark_node if the VALUE does not have
68    complete type when this function returns.  */
69
70 tree
71 require_complete_type (tree value)
72 {
73   tree type;
74
75   if (processing_template_decl || value == error_mark_node)
76     return value;
77
78   if (TREE_CODE (value) == OVERLOAD)
79     type = unknown_type_node;
80   else
81     type = TREE_TYPE (value);
82
83   if (type == error_mark_node)
84     return error_mark_node;
85
86   /* First, detect a valid value with a complete type.  */
87   if (COMPLETE_TYPE_P (type))
88     return value;
89
90   if (complete_type_or_else (type, value))
91     return value;
92   else
93     return error_mark_node;
94 }
95
96 /* Try to complete TYPE, if it is incomplete.  For example, if TYPE is
97    a template instantiation, do the instantiation.  Returns TYPE,
98    whether or not it could be completed, unless something goes
99    horribly wrong, in which case the error_mark_node is returned.  */
100
101 tree
102 complete_type (tree type)
103 {
104   if (type == NULL_TREE)
105     /* Rather than crash, we return something sure to cause an error
106        at some point.  */
107     return error_mark_node;
108
109   if (type == error_mark_node || COMPLETE_TYPE_P (type))
110     ;
111   else if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
112     {
113       tree t = complete_type (TREE_TYPE (type));
114       unsigned int needs_constructing, has_nontrivial_dtor;
115       if (COMPLETE_TYPE_P (t) && !dependent_type_p (type))
116         layout_type (type);
117       needs_constructing
118         = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
119       has_nontrivial_dtor
120         = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
121       for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
122         {
123           TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing;
124           TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor;
125         }
126     }
127   else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INSTANTIATION (type))
128     instantiate_class_template (TYPE_MAIN_VARIANT (type));
129
130   return type;
131 }
132
133 /* Like complete_type, but issue an error if the TYPE cannot be completed.
134    VALUE is used for informative diagnostics.
135    Returns NULL_TREE if the type cannot be made complete.  */
136
137 tree
138 complete_type_or_else (tree type, tree value)
139 {
140   type = complete_type (type);
141   if (type == error_mark_node)
142     /* We already issued an error.  */
143     return NULL_TREE;
144   else if (!COMPLETE_TYPE_P (type))
145     {
146       cxx_incomplete_type_diagnostic (value, type, DK_ERROR);
147       return NULL_TREE;
148     }
149   else
150     return type;
151 }
152
153 /* Return truthvalue of whether type of EXP is instantiated.  */
154
155 int
156 type_unknown_p (const_tree exp)
157 {
158   return (TREE_CODE (exp) == TREE_LIST
159           || TREE_TYPE (exp) == unknown_type_node);
160 }
161
162 \f
163 /* Return the common type of two parameter lists.
164    We assume that comptypes has already been done and returned 1;
165    if that isn't so, this may crash.
166
167    As an optimization, free the space we allocate if the parameter
168    lists are already common.  */
169
170 static tree
171 commonparms (tree p1, tree p2)
172 {
173   tree oldargs = p1, newargs, n;
174   int i, len;
175   int any_change = 0;
176
177   len = list_length (p1);
178   newargs = tree_last (p1);
179
180   if (newargs == void_list_node)
181     i = 1;
182   else
183     {
184       i = 0;
185       newargs = 0;
186     }
187
188   for (; i < len; i++)
189     newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
190
191   n = newargs;
192
193   for (i = 0; p1;
194        p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n), i++)
195     {
196       if (TREE_PURPOSE (p1) && !TREE_PURPOSE (p2))
197         {
198           TREE_PURPOSE (n) = TREE_PURPOSE (p1);
199           any_change = 1;
200         }
201       else if (! TREE_PURPOSE (p1))
202         {
203           if (TREE_PURPOSE (p2))
204             {
205               TREE_PURPOSE (n) = TREE_PURPOSE (p2);
206               any_change = 1;
207             }
208         }
209       else
210         {
211           if (1 != simple_cst_equal (TREE_PURPOSE (p1), TREE_PURPOSE (p2)))
212             any_change = 1;
213           TREE_PURPOSE (n) = TREE_PURPOSE (p2);
214         }
215       if (TREE_VALUE (p1) != TREE_VALUE (p2))
216         {
217           any_change = 1;
218           TREE_VALUE (n) = merge_types (TREE_VALUE (p1), TREE_VALUE (p2));
219         }
220       else
221         TREE_VALUE (n) = TREE_VALUE (p1);
222     }
223   if (! any_change)
224     return oldargs;
225
226   return newargs;
227 }
228
229 /* Given a type, perhaps copied for a typedef,
230    find the "original" version of it.  */
231 static tree
232 original_type (tree t)
233 {
234   int quals = cp_type_quals (t);
235   while (t != error_mark_node
236          && TYPE_NAME (t) != NULL_TREE)
237     {
238       tree x = TYPE_NAME (t);
239       if (TREE_CODE (x) != TYPE_DECL)
240         break;
241       x = DECL_ORIGINAL_TYPE (x);
242       if (x == NULL_TREE)
243         break;
244       t = x;
245     }
246   return cp_build_qualified_type (t, quals);
247 }
248
249 /* Return the common type for two arithmetic types T1 and T2 under the
250    usual arithmetic conversions.  The default conversions have already
251    been applied, and enumerated types converted to their compatible
252    integer types.  */
253
254 static tree
255 cp_common_type (tree t1, tree t2)
256 {
257   enum tree_code code1 = TREE_CODE (t1);
258   enum tree_code code2 = TREE_CODE (t2);
259   tree attributes;
260
261   /* In what follows, we slightly generalize the rules given in [expr] so
262      as to deal with `long long' and `complex'.  First, merge the
263      attributes.  */
264   attributes = (*targetm.merge_type_attributes) (t1, t2);
265
266   if (SCOPED_ENUM_P (t1) || SCOPED_ENUM_P (t2))
267     {
268       if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
269         return build_type_attribute_variant (t1, attributes);
270       else
271         return NULL_TREE;
272     }
273
274   /* FIXME: Attributes.  */
275   gcc_assert (ARITHMETIC_TYPE_P (t1)
276               || TREE_CODE (t1) == VECTOR_TYPE
277               || UNSCOPED_ENUM_P (t1));
278   gcc_assert (ARITHMETIC_TYPE_P (t2)
279               || TREE_CODE (t2) == VECTOR_TYPE
280               || UNSCOPED_ENUM_P (t2));
281
282   /* If one type is complex, form the common type of the non-complex
283      components, then make that complex.  Use T1 or T2 if it is the
284      required type.  */
285   if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
286     {
287       tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
288       tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
289       tree subtype
290         = type_after_usual_arithmetic_conversions (subtype1, subtype2);
291
292       if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
293         return build_type_attribute_variant (t1, attributes);
294       else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
295         return build_type_attribute_variant (t2, attributes);
296       else
297         return build_type_attribute_variant (build_complex_type (subtype),
298                                              attributes);
299     }
300
301   if (code1 == VECTOR_TYPE)
302     {
303       /* When we get here we should have two vectors of the same size.
304          Just prefer the unsigned one if present.  */
305       if (TYPE_UNSIGNED (t1))
306         return build_type_attribute_variant (t1, attributes);
307       else
308         return build_type_attribute_variant (t2, attributes);
309     }
310
311   /* If only one is real, use it as the result.  */
312   if (code1 == REAL_TYPE && code2 != REAL_TYPE)
313     return build_type_attribute_variant (t1, attributes);
314   if (code2 == REAL_TYPE && code1 != REAL_TYPE)
315     return build_type_attribute_variant (t2, attributes);
316
317   /* Both real or both integers; use the one with greater precision.  */
318   if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
319     return build_type_attribute_variant (t1, attributes);
320   else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
321     return build_type_attribute_variant (t2, attributes);
322
323   /* The types are the same; no need to do anything fancy.  */
324   if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
325     return build_type_attribute_variant (t1, attributes);
326
327   if (code1 != REAL_TYPE)
328     {
329       /* If one is unsigned long long, then convert the other to unsigned
330          long long.  */
331       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_unsigned_type_node)
332           || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_unsigned_type_node))
333         return build_type_attribute_variant (long_long_unsigned_type_node,
334                                              attributes);
335       /* If one is a long long, and the other is an unsigned long, and
336          long long can represent all the values of an unsigned long, then
337          convert to a long long.  Otherwise, convert to an unsigned long
338          long.  Otherwise, if either operand is long long, convert the
339          other to long long.
340
341          Since we're here, we know the TYPE_PRECISION is the same;
342          therefore converting to long long cannot represent all the values
343          of an unsigned long, so we choose unsigned long long in that
344          case.  */
345       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_long_integer_type_node)
346           || same_type_p (TYPE_MAIN_VARIANT (t2), long_long_integer_type_node))
347         {
348           tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
349                     ? long_long_unsigned_type_node
350                     : long_long_integer_type_node);
351           return build_type_attribute_variant (t, attributes);
352         }
353       if (int128_integer_type_node != NULL_TREE
354           && (same_type_p (TYPE_MAIN_VARIANT (t1),
355                            int128_integer_type_node)
356               || same_type_p (TYPE_MAIN_VARIANT (t2),
357                               int128_integer_type_node)))
358         {
359           tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
360                     ? int128_unsigned_type_node
361                     : int128_integer_type_node);
362           return build_type_attribute_variant (t, attributes);
363         }
364
365       /* Go through the same procedure, but for longs.  */
366       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
367           || same_type_p (TYPE_MAIN_VARIANT (t2), long_unsigned_type_node))
368         return build_type_attribute_variant (long_unsigned_type_node,
369                                              attributes);
370       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_integer_type_node)
371           || same_type_p (TYPE_MAIN_VARIANT (t2), long_integer_type_node))
372         {
373           tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
374                     ? long_unsigned_type_node : long_integer_type_node);
375           return build_type_attribute_variant (t, attributes);
376         }
377       /* Otherwise prefer the unsigned one.  */
378       if (TYPE_UNSIGNED (t1))
379         return build_type_attribute_variant (t1, attributes);
380       else
381         return build_type_attribute_variant (t2, attributes);
382     }
383   else
384     {
385       if (same_type_p (TYPE_MAIN_VARIANT (t1), long_double_type_node)
386           || same_type_p (TYPE_MAIN_VARIANT (t2), long_double_type_node))
387         return build_type_attribute_variant (long_double_type_node,
388                                              attributes);
389       if (same_type_p (TYPE_MAIN_VARIANT (t1), double_type_node)
390           || same_type_p (TYPE_MAIN_VARIANT (t2), double_type_node))
391         return build_type_attribute_variant (double_type_node,
392                                              attributes);
393       if (same_type_p (TYPE_MAIN_VARIANT (t1), float_type_node)
394           || same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
395         return build_type_attribute_variant (float_type_node,
396                                              attributes);
397
398       /* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
399          the standard C++ floating-point types.  Logic earlier in this
400          function has already eliminated the possibility that
401          TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
402          compelling reason to choose one or the other.  */
403       return build_type_attribute_variant (t1, attributes);
404     }
405 }
406
407 /* T1 and T2 are arithmetic or enumeration types.  Return the type
408    that will result from the "usual arithmetic conversions" on T1 and
409    T2 as described in [expr].  */
410
411 tree
412 type_after_usual_arithmetic_conversions (tree t1, tree t2)
413 {
414   gcc_assert (ARITHMETIC_TYPE_P (t1)
415               || TREE_CODE (t1) == VECTOR_TYPE
416               || UNSCOPED_ENUM_P (t1));
417   gcc_assert (ARITHMETIC_TYPE_P (t2)
418               || TREE_CODE (t2) == VECTOR_TYPE
419               || UNSCOPED_ENUM_P (t2));
420
421   /* Perform the integral promotions.  We do not promote real types here.  */
422   if (INTEGRAL_OR_ENUMERATION_TYPE_P (t1)
423       && INTEGRAL_OR_ENUMERATION_TYPE_P (t2))
424     {
425       t1 = type_promotes_to (t1);
426       t2 = type_promotes_to (t2);
427     }
428
429   return cp_common_type (t1, t2);
430 }
431
432 /* Subroutine of composite_pointer_type to implement the recursive
433    case.  See that function for documentation of the parameters.  */
434
435 static tree
436 composite_pointer_type_r (tree t1, tree t2, 
437                           composite_pointer_operation operation,
438                           tsubst_flags_t complain)
439 {
440   tree pointee1;
441   tree pointee2;
442   tree result_type;
443   tree attributes;
444
445   /* Determine the types pointed to by T1 and T2.  */
446   if (TREE_CODE (t1) == POINTER_TYPE)
447     {
448       pointee1 = TREE_TYPE (t1);
449       pointee2 = TREE_TYPE (t2);
450     }
451   else
452     {
453       pointee1 = TYPE_PTRMEM_POINTED_TO_TYPE (t1);
454       pointee2 = TYPE_PTRMEM_POINTED_TO_TYPE (t2);
455     }
456
457   /* [expr.rel]
458
459      Otherwise, the composite pointer type is a pointer type
460      similar (_conv.qual_) to the type of one of the operands,
461      with a cv-qualification signature (_conv.qual_) that is the
462      union of the cv-qualification signatures of the operand
463      types.  */
464   if (same_type_ignoring_top_level_qualifiers_p (pointee1, pointee2))
465     result_type = pointee1;
466   else if ((TREE_CODE (pointee1) == POINTER_TYPE
467             && TREE_CODE (pointee2) == POINTER_TYPE)
468            || (TYPE_PTR_TO_MEMBER_P (pointee1)
469                && TYPE_PTR_TO_MEMBER_P (pointee2)))
470     result_type = composite_pointer_type_r (pointee1, pointee2, operation,
471                                             complain);
472   else
473     {
474       if (complain & tf_error)
475         {
476           switch (operation)
477             {
478             case CPO_COMPARISON:
479               permerror (input_location, "comparison between "
480                          "distinct pointer types %qT and %qT lacks a cast",
481                          t1, t2);
482               break;
483             case CPO_CONVERSION:
484               permerror (input_location, "conversion between "
485                          "distinct pointer types %qT and %qT lacks a cast",
486                          t1, t2);
487               break;
488             case CPO_CONDITIONAL_EXPR:
489               permerror (input_location, "conditional expression between "
490                          "distinct pointer types %qT and %qT lacks a cast",
491                          t1, t2);
492               break;
493             default:
494               gcc_unreachable ();
495             }
496         }
497       result_type = void_type_node;
498     }
499   result_type = cp_build_qualified_type (result_type,
500                                          (cp_type_quals (pointee1)
501                                           | cp_type_quals (pointee2)));
502   /* If the original types were pointers to members, so is the
503      result.  */
504   if (TYPE_PTR_TO_MEMBER_P (t1))
505     {
506       if (!same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
507                         TYPE_PTRMEM_CLASS_TYPE (t2))
508           && (complain & tf_error))
509         {
510           switch (operation)
511             {
512             case CPO_COMPARISON:
513               permerror (input_location, "comparison between "
514                          "distinct pointer types %qT and %qT lacks a cast", 
515                          t1, t2);
516               break;
517             case CPO_CONVERSION:
518               permerror (input_location, "conversion between "
519                          "distinct pointer types %qT and %qT lacks a cast",
520                          t1, t2);
521               break;
522             case CPO_CONDITIONAL_EXPR:
523               permerror (input_location, "conditional expression between "
524                          "distinct pointer types %qT and %qT lacks a cast",
525                          t1, t2);
526               break;
527             default:
528               gcc_unreachable ();
529             }
530         }
531       result_type = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
532                                        result_type);
533     }
534   else
535     result_type = build_pointer_type (result_type);
536
537   /* Merge the attributes.  */
538   attributes = (*targetm.merge_type_attributes) (t1, t2);
539   return build_type_attribute_variant (result_type, attributes);
540 }
541
542 /* Return the composite pointer type (see [expr.rel]) for T1 and T2.
543    ARG1 and ARG2 are the values with those types.  The OPERATION is to
544    describe the operation between the pointer types,
545    in case an error occurs.
546
547    This routine also implements the computation of a common type for
548    pointers-to-members as per [expr.eq].  */
549
550 tree
551 composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
552                         composite_pointer_operation operation, 
553                         tsubst_flags_t complain)
554 {
555   tree class1;
556   tree class2;
557
558   /* [expr.rel]
559
560      If one operand is a null pointer constant, the composite pointer
561      type is the type of the other operand.  */
562   if (null_ptr_cst_p (arg1))
563     return t2;
564   if (null_ptr_cst_p (arg2))
565     return t1;
566
567   /* We have:
568
569        [expr.rel]
570
571        If one of the operands has type "pointer to cv1 void*", then
572        the other has type "pointer to cv2T", and the composite pointer
573        type is "pointer to cv12 void", where cv12 is the union of cv1
574        and cv2.
575
576     If either type is a pointer to void, make sure it is T1.  */
577   if (TREE_CODE (t2) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t2)))
578     {
579       tree t;
580       t = t1;
581       t1 = t2;
582       t2 = t;
583     }
584
585   /* Now, if T1 is a pointer to void, merge the qualifiers.  */
586   if (TREE_CODE (t1) == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (t1)))
587     {
588       tree attributes;
589       tree result_type;
590
591       if (TYPE_PTRFN_P (t2) && (complain & tf_error))
592         {
593           switch (operation)
594               {
595               case CPO_COMPARISON:
596                 pedwarn (input_location, OPT_pedantic, 
597                          "ISO C++ forbids comparison between "
598                          "pointer of type %<void *%> and pointer-to-function");
599                 break;
600               case CPO_CONVERSION:
601                 pedwarn (input_location, OPT_pedantic,
602                          "ISO C++ forbids conversion between "
603                          "pointer of type %<void *%> and pointer-to-function");
604                 break;
605               case CPO_CONDITIONAL_EXPR:
606                 pedwarn (input_location, OPT_pedantic,
607                          "ISO C++ forbids conditional expression between "
608                          "pointer of type %<void *%> and pointer-to-function");
609                 break;
610               default:
611                 gcc_unreachable ();
612               }
613         }
614       result_type
615         = cp_build_qualified_type (void_type_node,
616                                    (cp_type_quals (TREE_TYPE (t1))
617                                     | cp_type_quals (TREE_TYPE (t2))));
618       result_type = build_pointer_type (result_type);
619       /* Merge the attributes.  */
620       attributes = (*targetm.merge_type_attributes) (t1, t2);
621       return build_type_attribute_variant (result_type, attributes);
622     }
623
624   if (c_dialect_objc () && TREE_CODE (t1) == POINTER_TYPE
625       && TREE_CODE (t2) == POINTER_TYPE)
626     {
627       if (objc_compare_types (t1, t2, -3, NULL_TREE))
628         return t1;
629     }
630
631   /* [expr.eq] permits the application of a pointer conversion to
632      bring the pointers to a common type.  */
633   if (TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE
634       && CLASS_TYPE_P (TREE_TYPE (t1))
635       && CLASS_TYPE_P (TREE_TYPE (t2))
636       && !same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (t1),
637                                                      TREE_TYPE (t2)))
638     {
639       class1 = TREE_TYPE (t1);
640       class2 = TREE_TYPE (t2);
641
642       if (DERIVED_FROM_P (class1, class2))
643         t2 = (build_pointer_type
644               (cp_build_qualified_type (class1, cp_type_quals (class2))));
645       else if (DERIVED_FROM_P (class2, class1))
646         t1 = (build_pointer_type
647               (cp_build_qualified_type (class2, cp_type_quals (class1))));
648       else
649         {
650           if (complain & tf_error)
651             switch (operation)
652               {
653               case CPO_COMPARISON:
654                 error ("comparison between distinct "
655                        "pointer types %qT and %qT lacks a cast", t1, t2);
656                 break;
657               case CPO_CONVERSION:
658                 error ("conversion between distinct "
659                        "pointer types %qT and %qT lacks a cast", t1, t2);
660                 break;
661               case CPO_CONDITIONAL_EXPR:
662                 error ("conditional expression between distinct "
663                        "pointer types %qT and %qT lacks a cast", t1, t2);
664                 break;
665               default:
666                 gcc_unreachable ();
667               }
668           return error_mark_node;
669         }
670     }
671   /* [expr.eq] permits the application of a pointer-to-member
672      conversion to change the class type of one of the types.  */
673   else if (TYPE_PTR_TO_MEMBER_P (t1)
674            && !same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
675                             TYPE_PTRMEM_CLASS_TYPE (t2)))
676     {
677       class1 = TYPE_PTRMEM_CLASS_TYPE (t1);
678       class2 = TYPE_PTRMEM_CLASS_TYPE (t2);
679
680       if (DERIVED_FROM_P (class1, class2))
681         t1 = build_ptrmem_type (class2, TYPE_PTRMEM_POINTED_TO_TYPE (t1));
682       else if (DERIVED_FROM_P (class2, class1))
683         t2 = build_ptrmem_type (class1, TYPE_PTRMEM_POINTED_TO_TYPE (t2));
684       else
685         {
686           if (complain & tf_error)
687             switch (operation)
688               {
689               case CPO_COMPARISON:
690                 error ("comparison between distinct "
691                        "pointer-to-member types %qT and %qT lacks a cast",
692                        t1, t2);
693                 break;
694               case CPO_CONVERSION:
695                 error ("conversion between distinct "
696                        "pointer-to-member types %qT and %qT lacks a cast",
697                        t1, t2);
698                 break;
699               case CPO_CONDITIONAL_EXPR:
700                 error ("conditional expression between distinct "
701                        "pointer-to-member types %qT and %qT lacks a cast",
702                        t1, t2);
703                 break;
704               default:
705                 gcc_unreachable ();
706               }
707           return error_mark_node;
708         }
709     }
710
711   return composite_pointer_type_r (t1, t2, operation, complain);
712 }
713
714 /* Return the merged type of two types.
715    We assume that comptypes has already been done and returned 1;
716    if that isn't so, this may crash.
717
718    This just combines attributes and default arguments; any other
719    differences would cause the two types to compare unalike.  */
720
721 tree
722 merge_types (tree t1, tree t2)
723 {
724   enum tree_code code1;
725   enum tree_code code2;
726   tree attributes;
727
728   /* Save time if the two types are the same.  */
729   if (t1 == t2)
730     return t1;
731   if (original_type (t1) == original_type (t2))
732     return t1;
733
734   /* If one type is nonsense, use the other.  */
735   if (t1 == error_mark_node)
736     return t2;
737   if (t2 == error_mark_node)
738     return t1;
739
740   /* Merge the attributes.  */
741   attributes = (*targetm.merge_type_attributes) (t1, t2);
742
743   if (TYPE_PTRMEMFUNC_P (t1))
744     t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
745   if (TYPE_PTRMEMFUNC_P (t2))
746     t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
747
748   code1 = TREE_CODE (t1);
749   code2 = TREE_CODE (t2);
750   if (code1 != code2)
751     {
752       gcc_assert (code1 == TYPENAME_TYPE || code2 == TYPENAME_TYPE);
753       if (code1 == TYPENAME_TYPE)
754         {
755           t1 = resolve_typename_type (t1, /*only_current_p=*/true);
756           code1 = TREE_CODE (t1);
757         }
758       else
759         {
760           t2 = resolve_typename_type (t2, /*only_current_p=*/true);
761           code2 = TREE_CODE (t2);
762         }
763     }
764
765   switch (code1)
766     {
767     case POINTER_TYPE:
768     case REFERENCE_TYPE:
769       /* For two pointers, do this recursively on the target type.  */
770       {
771         tree target = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
772         int quals = cp_type_quals (t1);
773
774         if (code1 == POINTER_TYPE)
775           t1 = build_pointer_type (target);
776         else
777           t1 = cp_build_reference_type (target, TYPE_REF_IS_RVALUE (t1));
778         t1 = build_type_attribute_variant (t1, attributes);
779         t1 = cp_build_qualified_type (t1, quals);
780
781         if (TREE_CODE (target) == METHOD_TYPE)
782           t1 = build_ptrmemfunc_type (t1);
783
784         return t1;
785       }
786
787     case OFFSET_TYPE:
788       {
789         int quals;
790         tree pointee;
791         quals = cp_type_quals (t1);
792         pointee = merge_types (TYPE_PTRMEM_POINTED_TO_TYPE (t1),
793                                TYPE_PTRMEM_POINTED_TO_TYPE (t2));
794         t1 = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
795                                 pointee);
796         t1 = cp_build_qualified_type (t1, quals);
797         break;
798       }
799
800     case ARRAY_TYPE:
801       {
802         tree elt = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
803         /* Save space: see if the result is identical to one of the args.  */
804         if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
805           return build_type_attribute_variant (t1, attributes);
806         if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
807           return build_type_attribute_variant (t2, attributes);
808         /* Merge the element types, and have a size if either arg has one.  */
809         t1 = build_cplus_array_type
810           (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
811         break;
812       }
813
814     case FUNCTION_TYPE:
815       /* Function types: prefer the one that specified arg types.
816          If both do, merge the arg types.  Also merge the return types.  */
817       {
818         tree valtype = merge_types (TREE_TYPE (t1), TREE_TYPE (t2));
819         tree p1 = TYPE_ARG_TYPES (t1);
820         tree p2 = TYPE_ARG_TYPES (t2);
821         tree parms;
822         tree rval, raises;
823
824         /* Save space: see if the result is identical to one of the args.  */
825         if (valtype == TREE_TYPE (t1) && ! p2)
826           return cp_build_type_attribute_variant (t1, attributes);
827         if (valtype == TREE_TYPE (t2) && ! p1)
828           return cp_build_type_attribute_variant (t2, attributes);
829
830         /* Simple way if one arg fails to specify argument types.  */
831         if (p1 == NULL_TREE || TREE_VALUE (p1) == void_type_node)
832           {
833             parms = p2;
834             raises = TYPE_RAISES_EXCEPTIONS (t2);
835           }
836         else if (p2 == NULL_TREE || TREE_VALUE (p2) == void_type_node)
837           {
838             parms = p1;
839             raises = TYPE_RAISES_EXCEPTIONS (t1);
840           }
841         else
842           {
843             parms = commonparms (p1, p2);
844             /* In cases where we're merging a real declaration with a
845                built-in declaration, t1 is the real one.  */
846             raises = TYPE_RAISES_EXCEPTIONS (t1);
847           }
848
849         rval = build_function_type (valtype, parms);
850         gcc_assert (type_memfn_quals (t1) == type_memfn_quals (t2));
851         rval = apply_memfn_quals (rval, type_memfn_quals (t1));
852         t1 = build_exception_variant (rval, raises);
853         break;
854       }
855
856     case METHOD_TYPE:
857       {
858         /* Get this value the long way, since TYPE_METHOD_BASETYPE
859            is just the main variant of this.  */
860         tree basetype = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t2)));
861         tree raises = TYPE_RAISES_EXCEPTIONS (t1);
862         tree t3;
863
864         /* If this was a member function type, get back to the
865            original type of type member function (i.e., without
866            the class instance variable up front.  */
867         t1 = build_function_type (TREE_TYPE (t1),
868                                   TREE_CHAIN (TYPE_ARG_TYPES (t1)));
869         t2 = build_function_type (TREE_TYPE (t2),
870                                   TREE_CHAIN (TYPE_ARG_TYPES (t2)));
871         t3 = merge_types (t1, t2);
872         t3 = build_method_type_directly (basetype, TREE_TYPE (t3),
873                                          TYPE_ARG_TYPES (t3));
874         t1 = build_exception_variant (t3, raises);
875         break;
876       }
877
878     case TYPENAME_TYPE:
879       /* There is no need to merge attributes into a TYPENAME_TYPE.
880          When the type is instantiated it will have whatever
881          attributes result from the instantiation.  */
882       return t1;
883
884     default:;
885     }
886
887   if (attribute_list_equal (TYPE_ATTRIBUTES (t1), attributes))
888     return t1;
889   else if (attribute_list_equal (TYPE_ATTRIBUTES (t2), attributes))
890     return t2;
891   else
892     return cp_build_type_attribute_variant (t1, attributes);
893 }
894
895 /* Return the ARRAY_TYPE type without its domain.  */
896
897 tree
898 strip_array_domain (tree type)
899 {
900   tree t2;
901   gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
902   if (TYPE_DOMAIN (type) == NULL_TREE)
903     return type;
904   t2 = build_cplus_array_type (TREE_TYPE (type), NULL_TREE);
905   return cp_build_type_attribute_variant (t2, TYPE_ATTRIBUTES (type));
906 }
907
908 /* Wrapper around cp_common_type that is used by c-common.c and other
909    front end optimizations that remove promotions.  
910
911    Return the common type for two arithmetic types T1 and T2 under the
912    usual arithmetic conversions.  The default conversions have already
913    been applied, and enumerated types converted to their compatible
914    integer types.  */
915
916 tree
917 common_type (tree t1, tree t2)
918 {
919   /* If one type is nonsense, use the other  */
920   if (t1 == error_mark_node)
921     return t2;
922   if (t2 == error_mark_node)
923     return t1;
924
925   return cp_common_type (t1, t2);
926 }
927
928 /* Return the common type of two pointer types T1 and T2.  This is the
929    type for the result of most arithmetic operations if the operands
930    have the given two types.
931  
932    We assume that comp_target_types has already been done and returned
933    nonzero; if that isn't so, this may crash.  */
934
935 tree
936 common_pointer_type (tree t1, tree t2)
937 {
938   gcc_assert ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
939               || (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
940               || (TYPE_PTRMEMFUNC_P (t1) && TYPE_PTRMEMFUNC_P (t2)));
941
942   return composite_pointer_type (t1, t2, error_mark_node, error_mark_node,
943                                  CPO_CONVERSION, tf_warning_or_error);
944 }
945 \f
946 /* Compare two exception specifier types for exactness or subsetness, if
947    allowed. Returns false for mismatch, true for match (same, or
948    derived and !exact).
949
950    [except.spec] "If a class X ... objects of class X or any class publicly
951    and unambiguously derived from X. Similarly, if a pointer type Y * ...
952    exceptions of type Y * or that are pointers to any type publicly and
953    unambiguously derived from Y. Otherwise a function only allows exceptions
954    that have the same type ..."
955    This does not mention cv qualifiers and is different to what throw
956    [except.throw] and catch [except.catch] will do. They will ignore the
957    top level cv qualifiers, and allow qualifiers in the pointer to class
958    example.
959
960    We implement the letter of the standard.  */
961
962 static bool
963 comp_except_types (tree a, tree b, bool exact)
964 {
965   if (same_type_p (a, b))
966     return true;
967   else if (!exact)
968     {
969       if (cp_type_quals (a) || cp_type_quals (b))
970         return false;
971
972       if (TREE_CODE (a) == POINTER_TYPE
973           && TREE_CODE (b) == POINTER_TYPE)
974         {
975           a = TREE_TYPE (a);
976           b = TREE_TYPE (b);
977           if (cp_type_quals (a) || cp_type_quals (b))
978             return false;
979         }
980
981       if (TREE_CODE (a) != RECORD_TYPE
982           || TREE_CODE (b) != RECORD_TYPE)
983         return false;
984
985       if (PUBLICLY_UNIQUELY_DERIVED_P (a, b))
986         return true;
987     }
988   return false;
989 }
990
991 /* Return true if TYPE1 and TYPE2 are equivalent exception specifiers.
992    If EXACT is false, T2 can be stricter than T1 (according to 15.4/7),
993    otherwise it must be exact. Exception lists are unordered, but
994    we've already filtered out duplicates. Most lists will be in order,
995    we should try to make use of that.  */
996
997 bool
998 comp_except_specs (const_tree t1, const_tree t2, bool exact)
999 {
1000   const_tree probe;
1001   const_tree base;
1002   int  length = 0;
1003
1004   if (t1 == t2)
1005     return true;
1006
1007   if (t1 == NULL_TREE)                     /* T1 is ...  */
1008     return t2 == NULL_TREE || !exact;
1009   if (!TREE_VALUE (t1))                    /* t1 is EMPTY */
1010     return t2 != NULL_TREE && !TREE_VALUE (t2);
1011   if (t2 == NULL_TREE)                     /* T2 is ...  */
1012     return false;
1013   if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
1014     return !exact;
1015
1016   /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
1017      Count how many we find, to determine exactness. For exact matching and
1018      ordered T1, T2, this is an O(n) operation, otherwise its worst case is
1019      O(nm).  */
1020   for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
1021     {
1022       for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
1023         {
1024           tree a = TREE_VALUE (probe);
1025           tree b = TREE_VALUE (t2);
1026
1027           if (comp_except_types (a, b, exact))
1028             {
1029               if (probe == base && exact)
1030                 base = TREE_CHAIN (probe);
1031               length++;
1032               break;
1033             }
1034         }
1035       if (probe == NULL_TREE)
1036         return false;
1037     }
1038   return !exact || base == NULL_TREE || length == list_length (t1);
1039 }
1040
1041 /* Compare the array types T1 and T2.  ALLOW_REDECLARATION is true if
1042    [] can match [size].  */
1043
1044 static bool
1045 comp_array_types (const_tree t1, const_tree t2, bool allow_redeclaration)
1046 {
1047   tree d1;
1048   tree d2;
1049   tree max1, max2;
1050
1051   if (t1 == t2)
1052     return true;
1053
1054   /* The type of the array elements must be the same.  */
1055   if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1056     return false;
1057
1058   d1 = TYPE_DOMAIN (t1);
1059   d2 = TYPE_DOMAIN (t2);
1060
1061   if (d1 == d2)
1062     return true;
1063
1064   /* If one of the arrays is dimensionless, and the other has a
1065      dimension, they are of different types.  However, it is valid to
1066      write:
1067
1068        extern int a[];
1069        int a[3];
1070
1071      by [basic.link]:
1072
1073        declarations for an array object can specify
1074        array types that differ by the presence or absence of a major
1075        array bound (_dcl.array_).  */
1076   if (!d1 || !d2)
1077     return allow_redeclaration;
1078
1079   /* Check that the dimensions are the same.  */
1080
1081   if (!cp_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
1082     return false;
1083   max1 = TYPE_MAX_VALUE (d1);
1084   max2 = TYPE_MAX_VALUE (d2);
1085   if (processing_template_decl && !abi_version_at_least (2)
1086       && !value_dependent_expression_p (max1)
1087       && !value_dependent_expression_p (max2))
1088     {
1089       /* With abi-1 we do not fold non-dependent array bounds, (and
1090          consequently mangle them incorrectly).  We must therefore
1091          fold them here, to verify the domains have the same
1092          value.  */
1093       max1 = fold (max1);
1094       max2 = fold (max2);
1095     }
1096
1097   if (!cp_tree_equal (max1, max2))
1098     return false;
1099
1100   return true;
1101 }
1102
1103 /* Compare the relative position of T1 and T2 into their respective
1104    template parameter list.
1105    T1 and T2 must be template parameter types.
1106    Return TRUE if T1 and T2 have the same position, FALSE otherwise.  */
1107
1108 static bool
1109 comp_template_parms_position (tree t1, tree t2)
1110 {
1111   gcc_assert (t1 && t2
1112               && TREE_CODE (t1) == TREE_CODE (t2)
1113               && (TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM
1114                   || TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM
1115                   || TREE_CODE (t1) == TEMPLATE_TYPE_PARM));
1116
1117       if (TEMPLATE_TYPE_IDX (t1) != TEMPLATE_TYPE_IDX (t2)
1118           || TEMPLATE_TYPE_LEVEL (t1) != TEMPLATE_TYPE_LEVEL (t2)
1119           || (TEMPLATE_TYPE_PARAMETER_PACK (t1) 
1120               != TEMPLATE_TYPE_PARAMETER_PACK (t2)))
1121         return false;
1122
1123       return true;
1124 }
1125
1126 /* Subroutine of incompatible_dependent_types_p.
1127    Return the template parameter of the dependent type T.
1128    If T is a typedef, return the template parameters of
1129    the _decl_ of the typedef. T must be a dependent type.  */
1130
1131 static tree
1132 get_template_parms_of_dependent_type (tree t)
1133 {
1134   tree tinfo = NULL_TREE, tparms = NULL_TREE;
1135
1136   /* First, try the obvious case of getting the
1137      template info from T itself.  */
1138   if ((tinfo = get_template_info (t)))
1139     ;
1140   else if (TREE_CODE (t) == TEMPLATE_TYPE_PARM)
1141     return TEMPLATE_TYPE_PARM_SIBLING_PARMS (t);
1142   else if (typedef_variant_p (t)
1143            && !NAMESPACE_SCOPE_P (TYPE_NAME (t)))
1144     tinfo = get_template_info (DECL_CONTEXT (TYPE_NAME (t)));
1145   /* If T is a TYPENAME_TYPE which context is a template type
1146      parameter, get the template parameters from that context.  */
1147   else if (TYPE_CONTEXT (t)
1148            && TREE_CODE (TYPE_CONTEXT (t)) == TEMPLATE_TYPE_PARM)
1149    return TEMPLATE_TYPE_PARM_SIBLING_PARMS (TYPE_CONTEXT (t));
1150   else if (TYPE_CONTEXT (t)
1151            && !NAMESPACE_SCOPE_P (t))
1152     tinfo = get_template_info (TYPE_CONTEXT (t));
1153
1154   if (tinfo)
1155     tparms = DECL_TEMPLATE_PARMS (TI_TEMPLATE (tinfo));
1156
1157   return tparms;
1158 }
1159
1160 /* Subroutine of structural_comptypes.
1161    Compare the dependent types T1 and T2.
1162    Return TRUE if we are sure they can't be equal, FALSE otherwise.
1163    The whole point of this function is to support cases where either T1 or
1164    T2 is a typedef. In those cases, we need to compare the template parameters
1165    of the _decl_ of the typedef. If those don't match then we know T1
1166    and T2 cannot be equal.  */
1167
1168 static bool
1169 incompatible_dependent_types_p (tree t1, tree t2)
1170 {
1171   tree tparms1 = NULL_TREE, tparms2 = NULL_TREE;
1172   bool t1_typedef_variant_p, t2_typedef_variant_p;
1173
1174   if (!uses_template_parms (t1) || !uses_template_parms (t2))
1175     return false;
1176
1177   if (TREE_CODE (t1) == TEMPLATE_TYPE_PARM)
1178     {
1179       /* If T1 and T2 don't have the same relative position in their
1180          template parameters set, they can't be equal.  */
1181       if (!comp_template_parms_position (t1, t2))
1182         return true;
1183     }
1184
1185   t1_typedef_variant_p = typedef_variant_p (t1);
1186   t2_typedef_variant_p = typedef_variant_p (t2);
1187
1188   /* Either T1 or T2 must be a typedef.  */
1189   if (!t1_typedef_variant_p && !t2_typedef_variant_p)
1190     return false;
1191
1192   if (!t1_typedef_variant_p || !t2_typedef_variant_p)
1193     /* Either T1 or T2 is not a typedef so we cannot compare the
1194        the template parms of the typedefs of T1 and T2.
1195        At this point, if the main variant type of T1 and T2 are equal
1196        it means the two types can't be incompatible, from the perspective
1197        of this function.  */
1198     if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
1199       return false;
1200
1201   /* So if we reach this point, it means either T1 or T2 is a typedef variant.
1202      Let's compare their template parameters.  */
1203
1204   tparms1 = get_template_parms_of_dependent_type (t1);
1205   tparms2 = get_template_parms_of_dependent_type (t2);
1206
1207   /* If T2 is a template type parm and if we could not get the template
1208      parms it belongs to, that means we have not finished parsing the
1209      full set of template parameters of the template declaration it
1210      belongs to yet. If we could get the template parms T1 belongs to,
1211      that mostly means T1 and T2 belongs to templates that are
1212      different and incompatible.  */
1213   if (TREE_CODE (t1) == TEMPLATE_TYPE_PARM
1214       && (tparms1 == NULL_TREE || tparms2 == NULL_TREE)
1215       && tparms1 != tparms2)
1216     return true;
1217
1218   if (tparms1 == NULL_TREE
1219       || tparms2 == NULL_TREE
1220       || tparms1 == tparms2)
1221     return false;
1222
1223   /* And now compare the mighty template parms!  */
1224   return !comp_template_parms (tparms1, tparms2);
1225 }
1226
1227 /* Subroutine in comptypes.  */
1228
1229 static bool
1230 structural_comptypes (tree t1, tree t2, int strict)
1231 {
1232   if (t1 == t2)
1233     return true;
1234
1235   /* Suppress errors caused by previously reported errors.  */
1236   if (t1 == error_mark_node || t2 == error_mark_node)
1237     return false;
1238
1239   gcc_assert (TYPE_P (t1) && TYPE_P (t2));
1240
1241   /* TYPENAME_TYPEs should be resolved if the qualifying scope is the
1242      current instantiation.  */
1243   if (TREE_CODE (t1) == TYPENAME_TYPE)
1244     t1 = resolve_typename_type (t1, /*only_current_p=*/true);
1245
1246   if (TREE_CODE (t2) == TYPENAME_TYPE)
1247     t2 = resolve_typename_type (t2, /*only_current_p=*/true);
1248
1249   if (TYPE_PTRMEMFUNC_P (t1))
1250     t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
1251   if (TYPE_PTRMEMFUNC_P (t2))
1252     t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
1253
1254   /* Different classes of types can't be compatible.  */
1255   if (TREE_CODE (t1) != TREE_CODE (t2))
1256     return false;
1257
1258   /* Qualifiers must match.  For array types, we will check when we
1259      recur on the array element types.  */
1260   if (TREE_CODE (t1) != ARRAY_TYPE
1261       && cp_type_quals (t1) != cp_type_quals (t2))
1262     return false;
1263   if (TREE_CODE (t1) == FUNCTION_TYPE
1264       && type_memfn_quals (t1) != type_memfn_quals (t2))
1265     return false;
1266   if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
1267     return false;
1268
1269   /* If T1 and T2 are dependent typedefs then check upfront that
1270      the template parameters of their typedef DECLs match before
1271      going down checking their subtypes.  */
1272   if (incompatible_dependent_types_p (t1, t2))
1273     return false;
1274
1275   /* Allow for two different type nodes which have essentially the same
1276      definition.  Note that we already checked for equality of the type
1277      qualifiers (just above).  */
1278
1279   if (TREE_CODE (t1) != ARRAY_TYPE
1280       && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
1281     return true;
1282
1283
1284   /* Compare the types.  Break out if they could be the same.  */
1285   switch (TREE_CODE (t1))
1286     {
1287     case VOID_TYPE:
1288     case BOOLEAN_TYPE:
1289       /* All void and bool types are the same.  */
1290       break;
1291
1292     case INTEGER_TYPE:
1293     case FIXED_POINT_TYPE:
1294     case REAL_TYPE:
1295       /* With these nodes, we can't determine type equivalence by
1296          looking at what is stored in the nodes themselves, because
1297          two nodes might have different TYPE_MAIN_VARIANTs but still
1298          represent the same type.  For example, wchar_t and int could
1299          have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE,
1300          TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs
1301          and are distinct types. On the other hand, int and the
1302          following typedef
1303
1304            typedef int INT __attribute((may_alias));
1305
1306          have identical properties, different TYPE_MAIN_VARIANTs, but
1307          represent the same type.  The canonical type system keeps
1308          track of equivalence in this case, so we fall back on it.  */
1309       return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
1310
1311     case TEMPLATE_TEMPLATE_PARM:
1312     case BOUND_TEMPLATE_TEMPLATE_PARM:
1313       if (!comp_template_parms_position (t1, t2))
1314         return false;
1315       if (!comp_template_parms
1316           (DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t1)),
1317            DECL_TEMPLATE_PARMS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_DECL (t2))))
1318         return false;
1319       if (TREE_CODE (t1) == TEMPLATE_TEMPLATE_PARM)
1320         break;
1321       /* Don't check inheritance.  */
1322       strict = COMPARE_STRICT;
1323       /* Fall through.  */
1324
1325     case RECORD_TYPE:
1326     case UNION_TYPE:
1327       if (TYPE_TEMPLATE_INFO (t1) && TYPE_TEMPLATE_INFO (t2)
1328           && (TYPE_TI_TEMPLATE (t1) == TYPE_TI_TEMPLATE (t2)
1329               || TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
1330           && comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))
1331         break;
1332
1333       if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
1334         break;
1335       else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1))
1336         break;
1337
1338       return false;
1339
1340     case OFFSET_TYPE:
1341       if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
1342                       strict & ~COMPARE_REDECLARATION))
1343         return false;
1344       if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1345         return false;
1346       break;
1347
1348     case REFERENCE_TYPE:
1349       if (TYPE_REF_IS_RVALUE (t1) != TYPE_REF_IS_RVALUE (t2))
1350         return false;
1351       /* fall through to checks for pointer types */
1352
1353     case POINTER_TYPE:
1354       if (TYPE_MODE (t1) != TYPE_MODE (t2)
1355           || TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2)
1356           || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1357         return false;
1358       break;
1359
1360     case METHOD_TYPE:
1361     case FUNCTION_TYPE:
1362       if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1363         return false;
1364       if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))
1365         return false;
1366       break;
1367
1368     case ARRAY_TYPE:
1369       /* Target types must match incl. qualifiers.  */
1370       if (!comp_array_types (t1, t2, !!(strict & COMPARE_REDECLARATION)))
1371         return false;
1372       break;
1373
1374     case TEMPLATE_TYPE_PARM:
1375       /* If incompatible_dependent_types_p called earlier didn't decide
1376          T1 and T2 were different, they might be equal.  */
1377       break;
1378
1379     case TYPENAME_TYPE:
1380       if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
1381                           TYPENAME_TYPE_FULLNAME (t2)))
1382         return false;
1383       if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1384         return false;
1385       break;
1386
1387     case UNBOUND_CLASS_TEMPLATE:
1388       if (!cp_tree_equal (TYPE_IDENTIFIER (t1), TYPE_IDENTIFIER (t2)))
1389         return false;
1390       if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
1391         return false;
1392       break;
1393
1394     case COMPLEX_TYPE:
1395       if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1396         return false;
1397       break;
1398
1399     case VECTOR_TYPE:
1400       if (TYPE_VECTOR_SUBPARTS (t1) != TYPE_VECTOR_SUBPARTS (t2)
1401           || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1402         return false;
1403       break;
1404
1405     case TYPE_PACK_EXPANSION:
1406       return same_type_p (PACK_EXPANSION_PATTERN (t1), 
1407                           PACK_EXPANSION_PATTERN (t2));
1408
1409     case DECLTYPE_TYPE:
1410       if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t1)
1411           != DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t2)
1412           || (DECLTYPE_FOR_LAMBDA_CAPTURE (t1)
1413               != DECLTYPE_FOR_LAMBDA_CAPTURE (t2))
1414           || (DECLTYPE_FOR_LAMBDA_RETURN (t1)
1415               != DECLTYPE_FOR_LAMBDA_RETURN (t2))
1416           || !cp_tree_equal (DECLTYPE_TYPE_EXPR (t1), 
1417                              DECLTYPE_TYPE_EXPR (t2)))
1418         return false;
1419       break;
1420
1421     default:
1422       return false;
1423     }
1424
1425   /* If we get here, we know that from a target independent POV the
1426      types are the same.  Make sure the target attributes are also
1427      the same.  */
1428   return targetm.comp_type_attributes (t1, t2);
1429 }
1430
1431 /* Return true if T1 and T2 are related as allowed by STRICT.  STRICT
1432    is a bitwise-or of the COMPARE_* flags.  */
1433
1434 bool
1435 comptypes (tree t1, tree t2, int strict)
1436 {
1437   if (strict == COMPARE_STRICT)
1438     {
1439       if (t1 == t2)
1440         return true;
1441
1442       if (t1 == error_mark_node || t2 == error_mark_node)
1443         return false;
1444
1445       if (TYPE_STRUCTURAL_EQUALITY_P (t1) || TYPE_STRUCTURAL_EQUALITY_P (t2))
1446         /* At least one of the types requires structural equality, so
1447            perform a deep check. */
1448         return structural_comptypes (t1, t2, strict);
1449
1450 #ifdef ENABLE_CHECKING
1451       if (USE_CANONICAL_TYPES)
1452         {
1453           bool result = structural_comptypes (t1, t2, strict);
1454           
1455           if (result && TYPE_CANONICAL (t1) != TYPE_CANONICAL (t2))
1456             /* The two types are structurally equivalent, but their
1457                canonical types were different. This is a failure of the
1458                canonical type propagation code.*/
1459             internal_error 
1460               ("canonical types differ for identical types %T and %T", 
1461                t1, t2);
1462           else if (!result && TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2))
1463             /* Two types are structurally different, but the canonical
1464                types are the same. This means we were over-eager in
1465                assigning canonical types. */
1466             internal_error 
1467               ("same canonical type node for different types %T and %T",
1468                t1, t2);
1469           
1470           return result;
1471         }
1472 #else
1473       if (USE_CANONICAL_TYPES)
1474         return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
1475 #endif
1476       else
1477         return structural_comptypes (t1, t2, strict);
1478     }
1479   else if (strict == COMPARE_STRUCTURAL)
1480     return structural_comptypes (t1, t2, COMPARE_STRICT);
1481   else
1482     return structural_comptypes (t1, t2, strict);
1483 }
1484
1485 /* Returns 1 if TYPE1 is at least as qualified as TYPE2.  */
1486
1487 bool
1488 at_least_as_qualified_p (const_tree type1, const_tree type2)
1489 {
1490   int q1 = cp_type_quals (type1);
1491   int q2 = cp_type_quals (type2);
1492
1493   /* All qualifiers for TYPE2 must also appear in TYPE1.  */
1494   return (q1 & q2) == q2;
1495 }
1496
1497 /* Returns 1 if TYPE1 is more cv-qualified than TYPE2, -1 if TYPE2 is
1498    more cv-qualified that TYPE1, and 0 otherwise.  */
1499
1500 int
1501 comp_cv_qualification (const_tree type1, const_tree type2)
1502 {
1503   int q1 = cp_type_quals (type1);
1504   int q2 = cp_type_quals (type2);
1505
1506   if (q1 == q2)
1507     return 0;
1508
1509   if ((q1 & q2) == q2)
1510     return 1;
1511   else if ((q1 & q2) == q1)
1512     return -1;
1513
1514   return 0;
1515 }
1516
1517 /* Returns 1 if the cv-qualification signature of TYPE1 is a proper
1518    subset of the cv-qualification signature of TYPE2, and the types
1519    are similar.  Returns -1 if the other way 'round, and 0 otherwise.  */
1520
1521 int
1522 comp_cv_qual_signature (tree type1, tree type2)
1523 {
1524   if (comp_ptr_ttypes_real (type2, type1, -1))
1525     return 1;
1526   else if (comp_ptr_ttypes_real (type1, type2, -1))
1527     return -1;
1528   else
1529     return 0;
1530 }
1531 \f
1532 /* Subroutines of `comptypes'.  */
1533
1534 /* Return true if two parameter type lists PARMS1 and PARMS2 are
1535    equivalent in the sense that functions with those parameter types
1536    can have equivalent types.  The two lists must be equivalent,
1537    element by element.  */
1538
1539 bool
1540 compparms (const_tree parms1, const_tree parms2)
1541 {
1542   const_tree t1, t2;
1543
1544   /* An unspecified parmlist matches any specified parmlist
1545      whose argument types don't need default promotions.  */
1546
1547   for (t1 = parms1, t2 = parms2;
1548        t1 || t2;
1549        t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
1550     {
1551       /* If one parmlist is shorter than the other,
1552          they fail to match.  */
1553       if (!t1 || !t2)
1554         return false;
1555       if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
1556         return false;
1557     }
1558   return true;
1559 }
1560
1561 \f
1562 /* Process a sizeof or alignof expression where the operand is a
1563    type.  */
1564
1565 tree
1566 cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
1567 {
1568   tree value;
1569   bool dependent_p;
1570
1571   gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
1572   if (type == error_mark_node)
1573     return error_mark_node;
1574
1575   type = non_reference (type);
1576   if (TREE_CODE (type) == METHOD_TYPE)
1577     {
1578       if (complain)
1579         pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpointer_arith, 
1580                  "invalid application of %qs to a member function", 
1581                  operator_name_info[(int) op].name);
1582       value = size_one_node;
1583     }
1584
1585   dependent_p = dependent_type_p (type);
1586   if (!dependent_p)
1587     complete_type (type);
1588   if (dependent_p
1589       /* VLA types will have a non-constant size.  In the body of an
1590          uninstantiated template, we don't need to try to compute the
1591          value, because the sizeof expression is not an integral
1592          constant expression in that case.  And, if we do try to
1593          compute the value, we'll likely end up with SAVE_EXPRs, which
1594          the template substitution machinery does not expect to see.  */
1595       || (processing_template_decl 
1596           && COMPLETE_TYPE_P (type)
1597           && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST))
1598     {
1599       value = build_min (op, size_type_node, type);
1600       TREE_READONLY (value) = 1;
1601       return value;
1602     }
1603
1604   return c_sizeof_or_alignof_type (input_location, complete_type (type),
1605                                    op == SIZEOF_EXPR,
1606                                    complain);
1607 }
1608
1609 /* Return the size of the type, without producing any warnings for
1610    types whose size cannot be taken.  This routine should be used only
1611    in some other routine that has already produced a diagnostic about
1612    using the size of such a type.  */
1613 tree 
1614 cxx_sizeof_nowarn (tree type)
1615 {
1616   if (TREE_CODE (type) == FUNCTION_TYPE
1617       || TREE_CODE (type) == VOID_TYPE
1618       || TREE_CODE (type) == ERROR_MARK)
1619     return size_one_node;
1620   else if (!COMPLETE_TYPE_P (type))
1621     return size_zero_node;
1622   else
1623     return cxx_sizeof_or_alignof_type (type, SIZEOF_EXPR, false);
1624 }
1625
1626 /* Process a sizeof expression where the operand is an expression.  */
1627
1628 static tree
1629 cxx_sizeof_expr (tree e, tsubst_flags_t complain)
1630 {
1631   if (e == error_mark_node)
1632     return error_mark_node;
1633
1634   if (processing_template_decl)
1635     {
1636       e = build_min (SIZEOF_EXPR, size_type_node, e);
1637       TREE_SIDE_EFFECTS (e) = 0;
1638       TREE_READONLY (e) = 1;
1639
1640       return e;
1641     }
1642
1643   /* To get the size of a static data member declared as an array of
1644      unknown bound, we need to instantiate it.  */
1645   if (TREE_CODE (e) == VAR_DECL
1646       && VAR_HAD_UNKNOWN_BOUND (e)
1647       && DECL_TEMPLATE_INSTANTIATION (e))
1648     instantiate_decl (e, /*defer_ok*/true, /*expl_inst_mem*/false);
1649
1650   e = mark_type_use (e);
1651
1652   if (TREE_CODE (e) == COMPONENT_REF
1653       && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
1654       && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1655     {
1656       if (complain & tf_error)
1657         error ("invalid application of %<sizeof%> to a bit-field");
1658       else
1659         return error_mark_node;
1660       e = char_type_node;
1661     }
1662   else if (is_overloaded_fn (e))
1663     {
1664       if (complain & tf_error)
1665         permerror (input_location, "ISO C++ forbids applying %<sizeof%> to an expression of "
1666                    "function type");
1667       else
1668         return error_mark_node;
1669       e = char_type_node;
1670     }
1671   else if (type_unknown_p (e))
1672     {
1673       if (complain & tf_error)
1674         cxx_incomplete_type_error (e, TREE_TYPE (e));
1675       else
1676         return error_mark_node;
1677       e = char_type_node;
1678     }
1679   else
1680     e = TREE_TYPE (e);
1681
1682   return cxx_sizeof_or_alignof_type (e, SIZEOF_EXPR, complain & tf_error);
1683 }
1684
1685 /* Implement the __alignof keyword: Return the minimum required
1686    alignment of E, measured in bytes.  For VAR_DECL's and
1687    FIELD_DECL's return DECL_ALIGN (which can be set from an
1688    "aligned" __attribute__ specification).  */
1689
1690 static tree
1691 cxx_alignof_expr (tree e, tsubst_flags_t complain)
1692 {
1693   tree t;
1694
1695   if (e == error_mark_node)
1696     return error_mark_node;
1697
1698   if (processing_template_decl)
1699     {
1700       e = build_min (ALIGNOF_EXPR, size_type_node, e);
1701       TREE_SIDE_EFFECTS (e) = 0;
1702       TREE_READONLY (e) = 1;
1703
1704       return e;
1705     }
1706
1707   e = mark_type_use (e);
1708
1709   if (TREE_CODE (e) == VAR_DECL)
1710     t = size_int (DECL_ALIGN_UNIT (e));
1711   else if (TREE_CODE (e) == COMPONENT_REF
1712            && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
1713            && DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
1714     {
1715       if (complain & tf_error)
1716         error ("invalid application of %<__alignof%> to a bit-field");
1717       else
1718         return error_mark_node;
1719       t = size_one_node;
1720     }
1721   else if (TREE_CODE (e) == COMPONENT_REF
1722            && TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL)
1723     t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (e, 1)));
1724   else if (is_overloaded_fn (e))
1725     {
1726       if (complain & tf_error)
1727         permerror (input_location, "ISO C++ forbids applying %<__alignof%> to an expression of "
1728                    "function type");
1729       else
1730         return error_mark_node;
1731       if (TREE_CODE (e) == FUNCTION_DECL)
1732         t = size_int (DECL_ALIGN_UNIT (e));
1733       else
1734         t = size_one_node;
1735     }
1736   else if (type_unknown_p (e))
1737     {
1738       if (complain & tf_error)
1739         cxx_incomplete_type_error (e, TREE_TYPE (e));
1740       else
1741         return error_mark_node;
1742       t = size_one_node;
1743     }
1744   else
1745     return cxx_sizeof_or_alignof_type (TREE_TYPE (e), ALIGNOF_EXPR, 
1746                                        complain & tf_error);
1747
1748   return fold_convert (size_type_node, t);
1749 }
1750
1751 /* Process a sizeof or alignof expression E with code OP where the operand
1752    is an expression.  */
1753
1754 tree
1755 cxx_sizeof_or_alignof_expr (tree e, enum tree_code op, bool complain)
1756 {
1757   if (op == SIZEOF_EXPR)
1758     return cxx_sizeof_expr (e, complain? tf_warning_or_error : tf_none);
1759   else
1760     return cxx_alignof_expr (e, complain? tf_warning_or_error : tf_none);
1761 }
1762 \f
1763 /* EXPR is being used in a context that is not a function call.
1764    Enforce:
1765
1766      [expr.ref]
1767
1768      The expression can be used only as the left-hand operand of a
1769      member function call.
1770
1771      [expr.mptr.operator]
1772
1773      If the result of .* or ->* is a function, then that result can be
1774      used only as the operand for the function call operator ().
1775
1776    by issuing an error message if appropriate.  Returns true iff EXPR
1777    violates these rules.  */
1778
1779 bool
1780 invalid_nonstatic_memfn_p (const_tree expr, tsubst_flags_t complain)
1781 {
1782   if (expr && DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
1783     {
1784       if (complain & tf_error)
1785         error ("invalid use of non-static member function");
1786       return true;
1787     }
1788   return false;
1789 }
1790
1791 /* If EXP is a reference to a bitfield, and the type of EXP does not
1792    match the declared type of the bitfield, return the declared type
1793    of the bitfield.  Otherwise, return NULL_TREE.  */
1794
1795 tree
1796 is_bitfield_expr_with_lowered_type (const_tree exp)
1797 {
1798   switch (TREE_CODE (exp))
1799     {
1800     case COND_EXPR:
1801       if (!is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1)
1802                                                ? TREE_OPERAND (exp, 1)
1803                                                : TREE_OPERAND (exp, 0)))
1804         return NULL_TREE;
1805       return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 2));
1806
1807     case COMPOUND_EXPR:
1808       return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1));
1809
1810     case MODIFY_EXPR:
1811     case SAVE_EXPR:
1812       return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
1813
1814     case COMPONENT_REF:
1815       {
1816         tree field;
1817         
1818         field = TREE_OPERAND (exp, 1);
1819         if (TREE_CODE (field) != FIELD_DECL || !DECL_BIT_FIELD_TYPE (field))
1820           return NULL_TREE;
1821         if (same_type_ignoring_top_level_qualifiers_p
1822             (TREE_TYPE (exp), DECL_BIT_FIELD_TYPE (field)))
1823           return NULL_TREE;
1824         return DECL_BIT_FIELD_TYPE (field);
1825       }
1826
1827     CASE_CONVERT:
1828       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (exp, 0)))
1829           == TYPE_MAIN_VARIANT (TREE_TYPE (exp)))
1830         return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
1831       /* Fallthrough.  */
1832
1833     default:
1834       return NULL_TREE;
1835     }
1836 }
1837
1838 /* Like is_bitfield_with_lowered_type, except that if EXP is not a
1839    bitfield with a lowered type, the type of EXP is returned, rather
1840    than NULL_TREE.  */
1841
1842 tree
1843 unlowered_expr_type (const_tree exp)
1844 {
1845   tree type;
1846
1847   type = is_bitfield_expr_with_lowered_type (exp);
1848   if (!type)
1849     type = TREE_TYPE (exp);
1850
1851   return type;
1852 }
1853
1854 /* Perform the conversions in [expr] that apply when an lvalue appears
1855    in an rvalue context: the lvalue-to-rvalue, array-to-pointer, and
1856    function-to-pointer conversions.  In addition, manifest constants
1857    are replaced by their values, and bitfield references are converted
1858    to their declared types. Note that this function does not perform the
1859    lvalue-to-rvalue conversion for class types. If you need that conversion
1860    to for class types, then you probably need to use force_rvalue.
1861
1862    Although the returned value is being used as an rvalue, this
1863    function does not wrap the returned expression in a
1864    NON_LVALUE_EXPR; the caller is expected to be mindful of the fact
1865    that the return value is no longer an lvalue.  */
1866
1867 tree
1868 decay_conversion (tree exp)
1869 {
1870   tree type;
1871   enum tree_code code;
1872
1873   type = TREE_TYPE (exp);
1874   if (type == error_mark_node)
1875     return error_mark_node;
1876
1877   exp = mark_rvalue_use (exp);
1878
1879   exp = resolve_nondeduced_context (exp);
1880   if (type_unknown_p (exp))
1881     {
1882       cxx_incomplete_type_error (exp, TREE_TYPE (exp));
1883       return error_mark_node;
1884     }
1885
1886   exp = decl_constant_value (exp);
1887   if (error_operand_p (exp))
1888     return error_mark_node;
1889
1890   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
1891      Leave such NOP_EXPRs, since RHS is being used in non-lvalue context.  */
1892   code = TREE_CODE (type);
1893   if (code == VOID_TYPE)
1894     {
1895       error ("void value not ignored as it ought to be");
1896       return error_mark_node;
1897     }
1898   if (invalid_nonstatic_memfn_p (exp, tf_warning_or_error))
1899     return error_mark_node;
1900   if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
1901     return cp_build_unary_op (ADDR_EXPR, exp, 0, tf_warning_or_error);
1902   if (code == ARRAY_TYPE)
1903     {
1904       tree adr;
1905       tree ptrtype;
1906
1907       if (TREE_CODE (exp) == INDIRECT_REF)
1908         return build_nop (build_pointer_type (TREE_TYPE (type)),
1909                           TREE_OPERAND (exp, 0));
1910
1911       if (TREE_CODE (exp) == COMPOUND_EXPR)
1912         {
1913           tree op1 = decay_conversion (TREE_OPERAND (exp, 1));
1914           return build2 (COMPOUND_EXPR, TREE_TYPE (op1),
1915                          TREE_OPERAND (exp, 0), op1);
1916         }
1917
1918       if (!lvalue_p (exp)
1919           && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
1920         {
1921           error ("invalid use of non-lvalue array");
1922           return error_mark_node;
1923         }
1924
1925       ptrtype = build_pointer_type (TREE_TYPE (type));
1926
1927       if (TREE_CODE (exp) == VAR_DECL)
1928         {
1929           if (!cxx_mark_addressable (exp))
1930             return error_mark_node;
1931           adr = build_nop (ptrtype, build_address (exp));
1932           return adr;
1933         }
1934       /* This way is better for a COMPONENT_REF since it can
1935          simplify the offset for a component.  */
1936       adr = cp_build_unary_op (ADDR_EXPR, exp, 1, tf_warning_or_error);
1937       return cp_convert (ptrtype, adr);
1938     }
1939
1940   /* If a bitfield is used in a context where integral promotion
1941      applies, then the caller is expected to have used
1942      default_conversion.  That function promotes bitfields correctly
1943      before calling this function.  At this point, if we have a
1944      bitfield referenced, we may assume that is not subject to
1945      promotion, and that, therefore, the type of the resulting rvalue
1946      is the declared type of the bitfield.  */
1947   exp = convert_bitfield_to_declared_type (exp);
1948
1949   /* We do not call rvalue() here because we do not want to wrap EXP
1950      in a NON_LVALUE_EXPR.  */
1951
1952   /* [basic.lval]
1953
1954      Non-class rvalues always have cv-unqualified types.  */
1955   type = TREE_TYPE (exp);
1956   if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
1957     exp = build_nop (cv_unqualified (type), exp);
1958
1959   return exp;
1960 }
1961
1962 /* Perform preparatory conversions, as part of the "usual arithmetic
1963    conversions".  In particular, as per [expr]:
1964
1965      Whenever an lvalue expression appears as an operand of an
1966      operator that expects the rvalue for that operand, the
1967      lvalue-to-rvalue, array-to-pointer, or function-to-pointer
1968      standard conversions are applied to convert the expression to an
1969      rvalue.
1970
1971    In addition, we perform integral promotions here, as those are
1972    applied to both operands to a binary operator before determining
1973    what additional conversions should apply.  */
1974
1975 tree
1976 default_conversion (tree exp)
1977 {
1978   /* Check for target-specific promotions.  */
1979   tree promoted_type = targetm.promoted_type (TREE_TYPE (exp));
1980   if (promoted_type)
1981     exp = cp_convert (promoted_type, exp);
1982   /* Perform the integral promotions first so that bitfield
1983      expressions (which may promote to "int", even if the bitfield is
1984      declared "unsigned") are promoted correctly.  */
1985   else if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (exp)))
1986     exp = perform_integral_promotions (exp);
1987   /* Perform the other conversions.  */
1988   exp = decay_conversion (exp);
1989
1990   return exp;
1991 }
1992
1993 /* EXPR is an expression with an integral or enumeration type.
1994    Perform the integral promotions in [conv.prom], and return the
1995    converted value.  */
1996
1997 tree
1998 perform_integral_promotions (tree expr)
1999 {
2000   tree type;
2001   tree promoted_type;
2002
2003   expr = mark_rvalue_use (expr);
2004
2005   /* [conv.prom]
2006
2007      If the bitfield has an enumerated type, it is treated as any
2008      other value of that type for promotion purposes.  */
2009   type = is_bitfield_expr_with_lowered_type (expr);
2010   if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
2011     type = TREE_TYPE (expr);
2012   gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
2013   promoted_type = type_promotes_to (type);
2014   if (type != promoted_type)
2015     expr = cp_convert (promoted_type, expr);
2016   return expr;
2017 }
2018
2019 /* Returns nonzero iff exp is a STRING_CST or the result of applying
2020    decay_conversion to one.  */
2021
2022 int
2023 string_conv_p (const_tree totype, const_tree exp, int warn)
2024 {
2025   tree t;
2026
2027   if (TREE_CODE (totype) != POINTER_TYPE)
2028     return 0;
2029
2030   t = TREE_TYPE (totype);
2031   if (!same_type_p (t, char_type_node)
2032       && !same_type_p (t, char16_type_node)
2033       && !same_type_p (t, char32_type_node)
2034       && !same_type_p (t, wchar_type_node))
2035     return 0;
2036
2037   if (TREE_CODE (exp) == STRING_CST)
2038     {
2039       /* Make sure that we don't try to convert between char and wide chars.  */
2040       if (!same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (exp))), t))
2041         return 0;
2042     }
2043   else
2044     {
2045       /* Is this a string constant which has decayed to 'const char *'?  */
2046       t = build_pointer_type (cp_build_qualified_type (t, TYPE_QUAL_CONST));
2047       if (!same_type_p (TREE_TYPE (exp), t))
2048         return 0;
2049       STRIP_NOPS (exp);
2050       if (TREE_CODE (exp) != ADDR_EXPR
2051           || TREE_CODE (TREE_OPERAND (exp, 0)) != STRING_CST)
2052         return 0;
2053     }
2054
2055   /* This warning is not very useful, as it complains about printf.  */
2056   if (warn)
2057     warning (OPT_Wwrite_strings,
2058              "deprecated conversion from string constant to %qT",
2059              totype);
2060
2061   return 1;
2062 }
2063
2064 /* Given a COND_EXPR, MIN_EXPR, or MAX_EXPR in T, return it in a form that we
2065    can, for example, use as an lvalue.  This code used to be in
2066    unary_complex_lvalue, but we needed it to deal with `a = (d == c) ? b : c'
2067    expressions, where we're dealing with aggregates.  But now it's again only
2068    called from unary_complex_lvalue.  The case (in particular) that led to
2069    this was with CODE == ADDR_EXPR, since it's not an lvalue when we'd
2070    get it there.  */
2071
2072 static tree
2073 rationalize_conditional_expr (enum tree_code code, tree t,
2074                               tsubst_flags_t complain)
2075 {
2076   /* For MIN_EXPR or MAX_EXPR, fold-const.c has arranged things so that
2077      the first operand is always the one to be used if both operands
2078      are equal, so we know what conditional expression this used to be.  */
2079   if (TREE_CODE (t) == MIN_EXPR || TREE_CODE (t) == MAX_EXPR)
2080     {
2081       tree op0 = TREE_OPERAND (t, 0);
2082       tree op1 = TREE_OPERAND (t, 1);
2083
2084       /* The following code is incorrect if either operand side-effects.  */
2085       gcc_assert (!TREE_SIDE_EFFECTS (op0)
2086                   && !TREE_SIDE_EFFECTS (op1));
2087       return
2088         build_conditional_expr (build_x_binary_op ((TREE_CODE (t) == MIN_EXPR
2089                                                     ? LE_EXPR : GE_EXPR),
2090                                                    op0, TREE_CODE (op0),
2091                                                    op1, TREE_CODE (op1),
2092                                                    /*overloaded_p=*/NULL,
2093                                                    complain),
2094                                 cp_build_unary_op (code, op0, 0, complain),
2095                                 cp_build_unary_op (code, op1, 0, complain),
2096                                 complain);
2097     }
2098
2099   return
2100     build_conditional_expr (TREE_OPERAND (t, 0),
2101                             cp_build_unary_op (code, TREE_OPERAND (t, 1), 0,
2102                                                complain),
2103                             cp_build_unary_op (code, TREE_OPERAND (t, 2), 0,
2104                                                complain),
2105                             complain);
2106 }
2107
2108 /* Given the TYPE of an anonymous union field inside T, return the
2109    FIELD_DECL for the field.  If not found return NULL_TREE.  Because
2110    anonymous unions can nest, we must also search all anonymous unions
2111    that are directly reachable.  */
2112
2113 tree
2114 lookup_anon_field (tree t, tree type)
2115 {
2116   tree field;
2117
2118   for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
2119     {
2120       if (TREE_STATIC (field))
2121         continue;
2122       if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
2123         continue;
2124
2125       /* If we find it directly, return the field.  */
2126       if (DECL_NAME (field) == NULL_TREE
2127           && type == TYPE_MAIN_VARIANT (TREE_TYPE (field)))
2128         {
2129           return field;
2130         }
2131
2132       /* Otherwise, it could be nested, search harder.  */
2133       if (DECL_NAME (field) == NULL_TREE
2134           && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
2135         {
2136           tree subfield = lookup_anon_field (TREE_TYPE (field), type);
2137           if (subfield)
2138             return subfield;
2139         }
2140     }
2141   return NULL_TREE;
2142 }
2143
2144 /* Build an expression representing OBJECT.MEMBER.  OBJECT is an
2145    expression; MEMBER is a DECL or baselink.  If ACCESS_PATH is
2146    non-NULL, it indicates the path to the base used to name MEMBER.
2147    If PRESERVE_REFERENCE is true, the expression returned will have
2148    REFERENCE_TYPE if the MEMBER does.  Otherwise, the expression
2149    returned will have the type referred to by the reference.
2150
2151    This function does not perform access control; that is either done
2152    earlier by the parser when the name of MEMBER is resolved to MEMBER
2153    itself, or later when overload resolution selects one of the
2154    functions indicated by MEMBER.  */
2155
2156 tree
2157 build_class_member_access_expr (tree object, tree member,
2158                                 tree access_path, bool preserve_reference,
2159                                 tsubst_flags_t complain)
2160 {
2161   tree object_type;
2162   tree member_scope;
2163   tree result = NULL_TREE;
2164
2165   if (error_operand_p (object) || error_operand_p (member))
2166     return error_mark_node;
2167
2168   gcc_assert (DECL_P (member) || BASELINK_P (member));
2169
2170   /* [expr.ref]
2171
2172      The type of the first expression shall be "class object" (of a
2173      complete type).  */
2174   object_type = TREE_TYPE (object);
2175   if (!currently_open_class (object_type)
2176       && !complete_type_or_else (object_type, object))
2177     return error_mark_node;
2178   if (!CLASS_TYPE_P (object_type))
2179     {
2180       if (complain & tf_error)
2181         error ("request for member %qD in %qE, which is of non-class type %qT",
2182                member, object, object_type);
2183       return error_mark_node;
2184     }
2185
2186   /* The standard does not seem to actually say that MEMBER must be a
2187      member of OBJECT_TYPE.  However, that is clearly what is
2188      intended.  */
2189   if (DECL_P (member))
2190     {
2191       member_scope = DECL_CLASS_CONTEXT (member);
2192       mark_used (member);
2193       if (TREE_DEPRECATED (member))
2194         warn_deprecated_use (member, NULL_TREE);
2195     }
2196   else
2197     member_scope = BINFO_TYPE (BASELINK_ACCESS_BINFO (member));
2198   /* If MEMBER is from an anonymous aggregate, MEMBER_SCOPE will
2199      presently be the anonymous union.  Go outwards until we find a
2200      type related to OBJECT_TYPE.  */
2201   while (ANON_AGGR_TYPE_P (member_scope)
2202          && !same_type_ignoring_top_level_qualifiers_p (member_scope,
2203                                                         object_type))
2204     member_scope = TYPE_CONTEXT (member_scope);
2205   if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
2206     {
2207       if (complain & tf_error)
2208         {
2209           if (TREE_CODE (member) == FIELD_DECL)
2210             error ("invalid use of nonstatic data member %qE", member);
2211           else
2212             error ("%qD is not a member of %qT", member, object_type);
2213         }
2214       return error_mark_node;
2215     }
2216
2217   /* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x' into
2218      `(*(a ?  &b : &c)).x', and so on.  A COND_EXPR is only an lvalue
2219      in the front end; only _DECLs and _REFs are lvalues in the back end.  */
2220   {
2221     tree temp = unary_complex_lvalue (ADDR_EXPR, object);
2222     if (temp)
2223       object = cp_build_indirect_ref (temp, RO_NULL, complain);
2224   }
2225
2226   /* In [expr.ref], there is an explicit list of the valid choices for
2227      MEMBER.  We check for each of those cases here.  */
2228   if (TREE_CODE (member) == VAR_DECL)
2229     {
2230       /* A static data member.  */
2231       result = member;
2232       /* If OBJECT has side-effects, they are supposed to occur.  */
2233       if (TREE_SIDE_EFFECTS (object))
2234         result = build2 (COMPOUND_EXPR, TREE_TYPE (result), object, result);
2235     }
2236   else if (TREE_CODE (member) == FIELD_DECL)
2237     {
2238       /* A non-static data member.  */
2239       bool null_object_p;
2240       int type_quals;
2241       tree member_type;
2242
2243       null_object_p = (TREE_CODE (object) == INDIRECT_REF
2244                        && integer_zerop (TREE_OPERAND (object, 0)));
2245
2246       /* Convert OBJECT to the type of MEMBER.  */
2247       if (!same_type_p (TYPE_MAIN_VARIANT (object_type),
2248                         TYPE_MAIN_VARIANT (member_scope)))
2249         {
2250           tree binfo;
2251           base_kind kind;
2252
2253           binfo = lookup_base (access_path ? access_path : object_type,
2254                                member_scope, ba_unique,  &kind);
2255           if (binfo == error_mark_node)
2256             return error_mark_node;
2257
2258           /* It is invalid to try to get to a virtual base of a
2259              NULL object.  The most common cause is invalid use of
2260              offsetof macro.  */
2261           if (null_object_p && kind == bk_via_virtual)
2262             {
2263               if (complain & tf_error)
2264                 {
2265                   error ("invalid access to non-static data member %qD of "
2266                          "NULL object",
2267                          member);
2268                   error ("(perhaps the %<offsetof%> macro was used incorrectly)");
2269                 }
2270               return error_mark_node;
2271             }
2272
2273           /* Convert to the base.  */
2274           object = build_base_path (PLUS_EXPR, object, binfo,
2275                                     /*nonnull=*/1);
2276           /* If we found the base successfully then we should be able
2277              to convert to it successfully.  */
2278           gcc_assert (object != error_mark_node);
2279         }
2280
2281       /* Complain about other invalid uses of offsetof, even though they will
2282          give the right answer.  Note that we complain whether or not they
2283          actually used the offsetof macro, since there's no way to know at this
2284          point.  So we just give a warning, instead of a pedwarn.  */
2285       /* Do not produce this warning for base class field references, because
2286          we know for a fact that didn't come from offsetof.  This does occur
2287          in various testsuite cases where a null object is passed where a
2288          vtable access is required.  */
2289       if (null_object_p && warn_invalid_offsetof
2290           && CLASSTYPE_NON_STD_LAYOUT (object_type)
2291           && !DECL_FIELD_IS_BASE (member)
2292           && cp_unevaluated_operand == 0
2293           && (complain & tf_warning))
2294         {
2295           warning (OPT_Winvalid_offsetof, 
2296                    "invalid access to non-static data member %qD "
2297                    " of NULL object", member);
2298           warning (OPT_Winvalid_offsetof, 
2299                    "(perhaps the %<offsetof%> macro was used incorrectly)");
2300         }
2301
2302       /* If MEMBER is from an anonymous aggregate, we have converted
2303          OBJECT so that it refers to the class containing the
2304          anonymous union.  Generate a reference to the anonymous union
2305          itself, and recur to find MEMBER.  */
2306       if (ANON_AGGR_TYPE_P (DECL_CONTEXT (member))
2307           /* When this code is called from build_field_call, the
2308              object already has the type of the anonymous union.
2309              That is because the COMPONENT_REF was already
2310              constructed, and was then disassembled before calling
2311              build_field_call.  After the function-call code is
2312              cleaned up, this waste can be eliminated.  */
2313           && (!same_type_ignoring_top_level_qualifiers_p
2314               (TREE_TYPE (object), DECL_CONTEXT (member))))
2315         {
2316           tree anonymous_union;
2317
2318           anonymous_union = lookup_anon_field (TREE_TYPE (object),
2319                                                DECL_CONTEXT (member));
2320           object = build_class_member_access_expr (object,
2321                                                    anonymous_union,
2322                                                    /*access_path=*/NULL_TREE,
2323                                                    preserve_reference,
2324                                                    complain);
2325         }
2326
2327       /* Compute the type of the field, as described in [expr.ref].  */
2328       type_quals = TYPE_UNQUALIFIED;
2329       member_type = TREE_TYPE (member);
2330       if (TREE_CODE (member_type) != REFERENCE_TYPE)
2331         {
2332           type_quals = (cp_type_quals (member_type)
2333                         | cp_type_quals (object_type));
2334
2335           /* A field is const (volatile) if the enclosing object, or the
2336              field itself, is const (volatile).  But, a mutable field is
2337              not const, even within a const object.  */
2338           if (DECL_MUTABLE_P (member))
2339             type_quals &= ~TYPE_QUAL_CONST;
2340           member_type = cp_build_qualified_type (member_type, type_quals);
2341         }
2342
2343       result = build3 (COMPONENT_REF, member_type, object, member,
2344                        NULL_TREE);
2345       result = fold_if_not_in_template (result);
2346
2347       /* Mark the expression const or volatile, as appropriate.  Even
2348          though we've dealt with the type above, we still have to mark the
2349          expression itself.  */
2350       if (type_quals & TYPE_QUAL_CONST)
2351         TREE_READONLY (result) = 1;
2352       if (type_quals & TYPE_QUAL_VOLATILE)
2353         TREE_THIS_VOLATILE (result) = 1;
2354     }
2355   else if (BASELINK_P (member))
2356     {
2357       /* The member is a (possibly overloaded) member function.  */
2358       tree functions;
2359       tree type;
2360
2361       /* If the MEMBER is exactly one static member function, then we
2362          know the type of the expression.  Otherwise, we must wait
2363          until overload resolution has been performed.  */
2364       functions = BASELINK_FUNCTIONS (member);
2365       if (TREE_CODE (functions) == FUNCTION_DECL
2366           && DECL_STATIC_FUNCTION_P (functions))
2367         type = TREE_TYPE (functions);
2368       else
2369         type = unknown_type_node;
2370       /* Note that we do not convert OBJECT to the BASELINK_BINFO
2371          base.  That will happen when the function is called.  */
2372       result = build3 (COMPONENT_REF, type, object, member, NULL_TREE);
2373     }
2374   else if (TREE_CODE (member) == CONST_DECL)
2375     {
2376       /* The member is an enumerator.  */
2377       result = member;
2378       /* If OBJECT has side-effects, they are supposed to occur.  */
2379       if (TREE_SIDE_EFFECTS (object))
2380         result = build2 (COMPOUND_EXPR, TREE_TYPE (result),
2381                          object, result);
2382     }
2383   else
2384     {
2385       if (complain & tf_error)
2386         error ("invalid use of %qD", member);
2387       return error_mark_node;
2388     }
2389
2390   if (!preserve_reference)
2391     /* [expr.ref]
2392
2393        If E2 is declared to have type "reference to T", then ... the
2394        type of E1.E2 is T.  */
2395     result = convert_from_reference (result);
2396
2397   return result;
2398 }
2399
2400 /* Return the destructor denoted by OBJECT.SCOPE::DTOR_NAME, or, if
2401    SCOPE is NULL, by OBJECT.DTOR_NAME, where DTOR_NAME is ~type.  */
2402
2403 static tree
2404 lookup_destructor (tree object, tree scope, tree dtor_name)
2405 {
2406   tree object_type = TREE_TYPE (object);
2407   tree dtor_type = TREE_OPERAND (dtor_name, 0);
2408   tree expr;
2409
2410   if (scope && !check_dtor_name (scope, dtor_type))
2411     {
2412       error ("qualified type %qT does not match destructor name ~%qT",
2413              scope, dtor_type);
2414       return error_mark_node;
2415     }
2416   if (TREE_CODE (dtor_type) == IDENTIFIER_NODE)
2417     {
2418       /* In a template, names we can't find a match for are still accepted
2419          destructor names, and we check them here.  */
2420       if (check_dtor_name (object_type, dtor_type))
2421         dtor_type = object_type;
2422       else
2423         {
2424           error ("object type %qT does not match destructor name ~%qT",
2425                  object_type, dtor_type);
2426           return error_mark_node;
2427         }
2428       
2429     }
2430   else if (!DERIVED_FROM_P (dtor_type, TYPE_MAIN_VARIANT (object_type)))
2431     {
2432       error ("the type being destroyed is %qT, but the destructor refers to %qT",
2433              TYPE_MAIN_VARIANT (object_type), dtor_type);
2434       return error_mark_node;
2435     }
2436   expr = lookup_member (dtor_type, complete_dtor_identifier,
2437                         /*protect=*/1, /*want_type=*/false);
2438   expr = (adjust_result_of_qualified_name_lookup
2439           (expr, dtor_type, object_type));
2440   return expr;
2441 }
2442
2443 /* An expression of the form "A::template B" has been resolved to
2444    DECL.  Issue a diagnostic if B is not a template or template
2445    specialization.  */
2446
2447 void
2448 check_template_keyword (tree decl)
2449 {
2450   /* The standard says:
2451
2452       [temp.names]
2453
2454       If a name prefixed by the keyword template is not a member
2455       template, the program is ill-formed.
2456
2457      DR 228 removed the restriction that the template be a member
2458      template.
2459
2460      DR 96, if accepted would add the further restriction that explicit
2461      template arguments must be provided if the template keyword is
2462      used, but, as of 2005-10-16, that DR is still in "drafting".  If
2463      this DR is accepted, then the semantic checks here can be
2464      simplified, as the entity named must in fact be a template
2465      specialization, rather than, as at present, a set of overloaded
2466      functions containing at least one template function.  */
2467   if (TREE_CODE (decl) != TEMPLATE_DECL
2468       && TREE_CODE (decl) != TEMPLATE_ID_EXPR)
2469     {
2470       if (!is_overloaded_fn (decl))
2471         permerror (input_location, "%qD is not a template", decl);
2472       else
2473         {
2474           tree fns;
2475           fns = decl;
2476           if (BASELINK_P (fns))
2477             fns = BASELINK_FUNCTIONS (fns);
2478           while (fns)
2479             {
2480               tree fn = OVL_CURRENT (fns);
2481               if (TREE_CODE (fn) == TEMPLATE_DECL
2482                   || TREE_CODE (fn) == TEMPLATE_ID_EXPR)
2483                 break;
2484               if (TREE_CODE (fn) == FUNCTION_DECL
2485                   && DECL_USE_TEMPLATE (fn)
2486                   && PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (fn)))
2487                 break;
2488               fns = OVL_NEXT (fns);
2489             }
2490           if (!fns)
2491             permerror (input_location, "%qD is not a template", decl);
2492         }
2493     }
2494 }
2495
2496 /* This function is called by the parser to process a class member
2497    access expression of the form OBJECT.NAME.  NAME is a node used by
2498    the parser to represent a name; it is not yet a DECL.  It may,
2499    however, be a BASELINK where the BASELINK_FUNCTIONS is a
2500    TEMPLATE_ID_EXPR.  Templates must be looked up by the parser, and
2501    there is no reason to do the lookup twice, so the parser keeps the
2502    BASELINK.  TEMPLATE_P is true iff NAME was explicitly declared to
2503    be a template via the use of the "A::template B" syntax.  */
2504
2505 tree
2506 finish_class_member_access_expr (tree object, tree name, bool template_p,
2507                                  tsubst_flags_t complain)
2508 {
2509   tree expr;
2510   tree object_type;
2511   tree member;
2512   tree access_path = NULL_TREE;
2513   tree orig_object = object;
2514   tree orig_name = name;
2515
2516   if (object == error_mark_node || name == error_mark_node)
2517     return error_mark_node;
2518
2519   /* If OBJECT is an ObjC class instance, we must obey ObjC access rules.  */
2520   if (!objc_is_public (object, name))
2521     return error_mark_node;
2522
2523   object_type = TREE_TYPE (object);
2524
2525   if (processing_template_decl)
2526     {
2527       if (/* If OBJECT_TYPE is dependent, so is OBJECT.NAME.  */
2528           dependent_type_p (object_type)
2529           /* If NAME is just an IDENTIFIER_NODE, then the expression
2530              is dependent.  */
2531           || TREE_CODE (object) == IDENTIFIER_NODE
2532           /* If NAME is "f<args>", where either 'f' or 'args' is
2533              dependent, then the expression is dependent.  */
2534           || (TREE_CODE (name) == TEMPLATE_ID_EXPR
2535               && dependent_template_id_p (TREE_OPERAND (name, 0),
2536                                           TREE_OPERAND (name, 1)))
2537           /* If NAME is "T::X" where "T" is dependent, then the
2538              expression is dependent.  */
2539           || (TREE_CODE (name) == SCOPE_REF
2540               && TYPE_P (TREE_OPERAND (name, 0))
2541               && dependent_type_p (TREE_OPERAND (name, 0))))
2542         return build_min_nt (COMPONENT_REF, object, name, NULL_TREE);
2543       object = build_non_dependent_expr (object);
2544     }
2545
2546   /* [expr.ref]
2547
2548      The type of the first expression shall be "class object" (of a
2549      complete type).  */
2550   if (!currently_open_class (object_type)
2551       && !complete_type_or_else (object_type, object))
2552     return error_mark_node;
2553   if (!CLASS_TYPE_P (object_type))
2554     {
2555       if (complain & tf_error)
2556         error ("request for member %qD in %qE, which is of non-class type %qT",
2557                name, object, object_type);
2558       return error_mark_node;
2559     }
2560
2561   if (BASELINK_P (name))
2562     /* A member function that has already been looked up.  */
2563     member = name;
2564   else
2565     {
2566       bool is_template_id = false;
2567       tree template_args = NULL_TREE;
2568       tree scope;
2569
2570       if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
2571         {
2572           is_template_id = true;
2573           template_args = TREE_OPERAND (name, 1);
2574           name = TREE_OPERAND (name, 0);
2575
2576           if (TREE_CODE (name) == OVERLOAD)
2577             name = DECL_NAME (get_first_fn (name));
2578           else if (DECL_P (name))
2579             name = DECL_NAME (name);
2580         }
2581
2582       if (TREE_CODE (name) == SCOPE_REF)
2583         {
2584           /* A qualified name.  The qualifying class or namespace `S'
2585              has already been looked up; it is either a TYPE or a
2586              NAMESPACE_DECL.  */
2587           scope = TREE_OPERAND (name, 0);
2588           name = TREE_OPERAND (name, 1);
2589
2590           /* If SCOPE is a namespace, then the qualified name does not
2591              name a member of OBJECT_TYPE.  */
2592           if (TREE_CODE (scope) == NAMESPACE_DECL)
2593             {
2594               if (complain & tf_error)
2595                 error ("%<%D::%D%> is not a member of %qT",
2596                        scope, name, object_type);
2597               return error_mark_node;
2598             }
2599
2600           gcc_assert (CLASS_TYPE_P (scope));
2601           gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE
2602                       || TREE_CODE (name) == BIT_NOT_EXPR);
2603
2604           if (constructor_name_p (name, scope))
2605             {
2606               if (complain & tf_error)
2607                 error ("cannot call constructor %<%T::%D%> directly",
2608                        scope, name);
2609               return error_mark_node;
2610             }
2611
2612           /* Find the base of OBJECT_TYPE corresponding to SCOPE.  */
2613           access_path = lookup_base (object_type, scope, ba_check, NULL);
2614           if (access_path == error_mark_node)
2615             return error_mark_node;
2616           if (!access_path)
2617             {
2618               if (complain & tf_error)
2619                 error ("%qT is not a base of %qT", scope, object_type);
2620               return error_mark_node;
2621             }
2622         }
2623       else
2624         {
2625           scope = NULL_TREE;
2626           access_path = object_type;
2627         }
2628
2629       if (TREE_CODE (name) == BIT_NOT_EXPR)
2630         member = lookup_destructor (object, scope, name);
2631       else
2632         {
2633           /* Look up the member.  */
2634           member = lookup_member (access_path, name, /*protect=*/1,
2635                                   /*want_type=*/false);
2636           if (member == NULL_TREE)
2637             {
2638               if (complain & tf_error)
2639                 error ("%qD has no member named %qE", object_type, name);
2640               return error_mark_node;
2641             }
2642           if (member == error_mark_node)
2643             return error_mark_node;
2644         }
2645
2646       if (is_template_id)
2647         {
2648           tree templ = member;
2649
2650           if (BASELINK_P (templ))
2651             templ = lookup_template_function (templ, template_args);
2652           else
2653             {
2654               if (complain & tf_error)
2655                 error ("%qD is not a member template function", name);
2656               return error_mark_node;
2657             }
2658         }
2659     }
2660
2661   if (TREE_DEPRECATED (member))
2662     warn_deprecated_use (member, NULL_TREE);
2663
2664   if (template_p)
2665     check_template_keyword (member);
2666
2667   expr = build_class_member_access_expr (object, member, access_path,
2668                                          /*preserve_reference=*/false,
2669                                          complain);
2670   if (processing_template_decl && expr != error_mark_node)
2671     {
2672       if (BASELINK_P (member))
2673         {
2674           if (TREE_CODE (orig_name) == SCOPE_REF)
2675             BASELINK_QUALIFIED_P (member) = 1;
2676           orig_name = member;
2677         }
2678       return build_min_non_dep (COMPONENT_REF, expr,
2679                                 orig_object, orig_name,
2680                                 NULL_TREE);
2681     }
2682
2683   return expr;
2684 }
2685
2686 /* Return an expression for the MEMBER_NAME field in the internal
2687    representation of PTRMEM, a pointer-to-member function.  (Each
2688    pointer-to-member function type gets its own RECORD_TYPE so it is
2689    more convenient to access the fields by name than by FIELD_DECL.)
2690    This routine converts the NAME to a FIELD_DECL and then creates the
2691    node for the complete expression.  */
2692
2693 tree
2694 build_ptrmemfunc_access_expr (tree ptrmem, tree member_name)
2695 {
2696   tree ptrmem_type;
2697   tree member;
2698   tree member_type;
2699
2700   /* This code is a stripped down version of
2701      build_class_member_access_expr.  It does not work to use that
2702      routine directly because it expects the object to be of class
2703      type.  */
2704   ptrmem_type = TREE_TYPE (ptrmem);
2705   gcc_assert (TYPE_PTRMEMFUNC_P (ptrmem_type));
2706   member = lookup_member (ptrmem_type, member_name, /*protect=*/0,
2707                           /*want_type=*/false);
2708   member_type = cp_build_qualified_type (TREE_TYPE (member),
2709                                          cp_type_quals (ptrmem_type));
2710   return fold_build3_loc (input_location,
2711                       COMPONENT_REF, member_type,
2712                       ptrmem, member, NULL_TREE);
2713 }
2714
2715 /* Given an expression PTR for a pointer, return an expression
2716    for the value pointed to.
2717    ERRORSTRING is the name of the operator to appear in error messages.
2718
2719    This function may need to overload OPERATOR_FNNAME.
2720    Must also handle REFERENCE_TYPEs for C++.  */
2721
2722 tree
2723 build_x_indirect_ref (tree expr, ref_operator errorstring, 
2724                       tsubst_flags_t complain)
2725 {
2726   tree orig_expr = expr;
2727   tree rval;
2728
2729   if (processing_template_decl)
2730     {
2731       /* Retain the type if we know the operand is a pointer so that
2732          describable_type doesn't make auto deduction break.  */
2733       if (TREE_TYPE (expr) && POINTER_TYPE_P (TREE_TYPE (expr)))
2734         return build_min (INDIRECT_REF, TREE_TYPE (TREE_TYPE (expr)), expr);
2735       if (type_dependent_expression_p (expr))
2736         return build_min_nt (INDIRECT_REF, expr);
2737       expr = build_non_dependent_expr (expr);
2738     }
2739
2740   rval = build_new_op (INDIRECT_REF, LOOKUP_NORMAL, expr, NULL_TREE,
2741                        NULL_TREE, /*overloaded_p=*/NULL, complain);
2742   if (!rval)
2743     rval = cp_build_indirect_ref (expr, errorstring, complain);
2744
2745   if (processing_template_decl && rval != error_mark_node)
2746     return build_min_non_dep (INDIRECT_REF, rval, orig_expr);
2747   else
2748     return rval;
2749 }
2750
2751 /* Helper function called from c-common.  */
2752 tree
2753 build_indirect_ref (location_t loc __attribute__ ((__unused__)),
2754                     tree ptr, ref_operator errorstring)
2755 {
2756   return cp_build_indirect_ref (ptr, errorstring, tf_warning_or_error);
2757 }
2758
2759 tree
2760 cp_build_indirect_ref (tree ptr, ref_operator errorstring, 
2761                        tsubst_flags_t complain)
2762 {
2763   tree pointer, type;
2764
2765   if (ptr == error_mark_node)
2766     return error_mark_node;
2767
2768   if (ptr == current_class_ptr)
2769     return current_class_ref;
2770
2771   pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
2772              ? ptr : decay_conversion (ptr));
2773   type = TREE_TYPE (pointer);
2774
2775   if (POINTER_TYPE_P (type))
2776     {
2777       /* [expr.unary.op]
2778
2779          If the type of the expression is "pointer to T," the type
2780          of  the  result  is  "T."  */
2781       tree t = TREE_TYPE (type);
2782
2783       if (CONVERT_EXPR_P (ptr)
2784           || TREE_CODE (ptr) == VIEW_CONVERT_EXPR)
2785         {
2786           /* If a warning is issued, mark it to avoid duplicates from
2787              the backend.  This only needs to be done at
2788              warn_strict_aliasing > 2.  */
2789           if (warn_strict_aliasing > 2)
2790             if (strict_aliasing_warning (TREE_TYPE (TREE_OPERAND (ptr, 0)),
2791                                          type, TREE_OPERAND (ptr, 0)))
2792               TREE_NO_WARNING (ptr) = 1;
2793         }
2794
2795       if (VOID_TYPE_P (t))
2796         {
2797           /* A pointer to incomplete type (other than cv void) can be
2798              dereferenced [expr.unary.op]/1  */
2799           if (complain & tf_error)
2800             error ("%qT is not a pointer-to-object type", type);
2801           return error_mark_node;
2802         }
2803       else if (TREE_CODE (pointer) == ADDR_EXPR
2804                && same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
2805         /* The POINTER was something like `&x'.  We simplify `*&x' to
2806            `x'.  */
2807         return TREE_OPERAND (pointer, 0);
2808       else
2809         {
2810           tree ref = build1 (INDIRECT_REF, t, pointer);
2811
2812           /* We *must* set TREE_READONLY when dereferencing a pointer to const,
2813              so that we get the proper error message if the result is used
2814              to assign to.  Also, &* is supposed to be a no-op.  */
2815           TREE_READONLY (ref) = CP_TYPE_CONST_P (t);
2816           TREE_THIS_VOLATILE (ref) = CP_TYPE_VOLATILE_P (t);
2817           TREE_SIDE_EFFECTS (ref)
2818             = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (pointer));
2819           return ref;
2820         }
2821     }
2822   else if (!(complain & tf_error))
2823     /* Don't emit any errors; we'll just return ERROR_MARK_NODE later.  */
2824     ;
2825   /* `pointer' won't be an error_mark_node if we were given a
2826      pointer to member, so it's cool to check for this here.  */
2827   else if (TYPE_PTR_TO_MEMBER_P (type))
2828     switch (errorstring)
2829       {
2830          case RO_ARRAY_INDEXING:
2831            error ("invalid use of array indexing on pointer to member");
2832            break;
2833          case RO_UNARY_STAR:
2834            error ("invalid use of unary %<*%> on pointer to member");
2835            break;
2836          case RO_IMPLICIT_CONVERSION:
2837            error ("invalid use of implicit conversion on pointer to member");
2838            break;
2839          default:
2840            gcc_unreachable ();
2841       }
2842   else if (pointer != error_mark_node)
2843     switch (errorstring)
2844       {
2845          case RO_NULL:
2846            error ("invalid type argument");
2847            break;
2848          case RO_ARRAY_INDEXING:
2849            error ("invalid type argument of array indexing");
2850            break;
2851          case RO_UNARY_STAR:
2852            error ("invalid type argument of unary %<*%>");
2853            break;
2854          case RO_IMPLICIT_CONVERSION:
2855            error ("invalid type argument of implicit conversion");
2856            break;
2857          default:
2858            gcc_unreachable ();
2859       }
2860   return error_mark_node;
2861 }
2862
2863 /* This handles expressions of the form "a[i]", which denotes
2864    an array reference.
2865
2866    This is logically equivalent in C to *(a+i), but we may do it differently.
2867    If A is a variable or a member, we generate a primitive ARRAY_REF.
2868    This avoids forcing the array out of registers, and can work on
2869    arrays that are not lvalues (for example, members of structures returned
2870    by functions).
2871
2872    If INDEX is of some user-defined type, it must be converted to
2873    integer type.  Otherwise, to make a compatible PLUS_EXPR, it
2874    will inherit the type of the array, which will be some pointer type.
2875    
2876    LOC is the location to use in building the array reference.  */
2877
2878 tree
2879 cp_build_array_ref (location_t loc, tree array, tree idx,
2880                     tsubst_flags_t complain)
2881 {
2882   tree ret;
2883
2884   if (idx == 0)
2885     {
2886       if (complain & tf_error)
2887         error_at (loc, "subscript missing in array reference");
2888       return error_mark_node;
2889     }
2890
2891   if (TREE_TYPE (array) == error_mark_node
2892       || TREE_TYPE (idx) == error_mark_node)
2893     return error_mark_node;
2894
2895   /* If ARRAY is a COMPOUND_EXPR or COND_EXPR, move our reference
2896      inside it.  */
2897   switch (TREE_CODE (array))
2898     {
2899     case COMPOUND_EXPR:
2900       {
2901         tree value = cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
2902                                          complain);
2903         ret = build2 (COMPOUND_EXPR, TREE_TYPE (value),
2904                       TREE_OPERAND (array, 0), value);
2905         SET_EXPR_LOCATION (ret, loc);
2906         return ret;
2907       }
2908
2909     case COND_EXPR:
2910       ret = build_conditional_expr
2911               (TREE_OPERAND (array, 0),
2912                cp_build_array_ref (loc, TREE_OPERAND (array, 1), idx,
2913                                    complain),
2914                cp_build_array_ref (loc, TREE_OPERAND (array, 2), idx,
2915                                    complain),
2916                tf_warning_or_error);
2917       protected_set_expr_location (ret, loc);
2918       return ret;
2919
2920     default:
2921       break;
2922     }
2923
2924   if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE)
2925     {
2926       tree rval, type;
2927
2928       warn_array_subscript_with_type_char (idx);
2929
2930       if (!INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (TREE_TYPE (idx)))
2931         {
2932           if (complain & tf_error)
2933             error_at (loc, "array subscript is not an integer");
2934           return error_mark_node;
2935         }
2936
2937       /* Apply integral promotions *after* noticing character types.
2938          (It is unclear why we do these promotions -- the standard
2939          does not say that we should.  In fact, the natural thing would
2940          seem to be to convert IDX to ptrdiff_t; we're performing
2941          pointer arithmetic.)  */
2942       idx = perform_integral_promotions (idx);
2943
2944       /* An array that is indexed by a non-constant
2945          cannot be stored in a register; we must be able to do
2946          address arithmetic on its address.
2947          Likewise an array of elements of variable size.  */
2948       if (TREE_CODE (idx) != INTEGER_CST
2949           || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
2950               && (TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array))))
2951                   != INTEGER_CST)))
2952         {
2953           if (!cxx_mark_addressable (array))
2954             return error_mark_node;
2955         }
2956
2957       /* An array that is indexed by a constant value which is not within
2958          the array bounds cannot be stored in a register either; because we
2959          would get a crash in store_bit_field/extract_bit_field when trying
2960          to access a non-existent part of the register.  */
2961       if (TREE_CODE (idx) == INTEGER_CST
2962           && TYPE_DOMAIN (TREE_TYPE (array))
2963           && ! int_fits_type_p (idx, TYPE_DOMAIN (TREE_TYPE (array))))
2964         {
2965           if (!cxx_mark_addressable (array))
2966             return error_mark_node;
2967         }
2968
2969       if (!lvalue_p (array) && (complain & tf_error))
2970         pedwarn (loc, OPT_pedantic, 
2971                  "ISO C++ forbids subscripting non-lvalue array");
2972
2973       /* Note in C++ it is valid to subscript a `register' array, since
2974          it is valid to take the address of something with that
2975          storage specification.  */
2976       if (extra_warnings)
2977         {
2978           tree foo = array;
2979           while (TREE_CODE (foo) == COMPONENT_REF)
2980             foo = TREE_OPERAND (foo, 0);
2981           if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo)
2982               && (complain & tf_warning))
2983             warning_at (loc, OPT_Wextra,
2984                         "subscripting array declared %<register%>");
2985         }
2986
2987       type = TREE_TYPE (TREE_TYPE (array));
2988       rval = build4 (ARRAY_REF, type, array, idx, NULL_TREE, NULL_TREE);
2989       /* Array ref is const/volatile if the array elements are
2990          or if the array is..  */
2991       TREE_READONLY (rval)
2992         |= (CP_TYPE_CONST_P (type) | TREE_READONLY (array));
2993       TREE_SIDE_EFFECTS (rval)
2994         |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array));
2995       TREE_THIS_VOLATILE (rval)
2996         |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array));
2997       ret = require_complete_type (fold_if_not_in_template (rval));
2998       protected_set_expr_location (ret, loc);
2999       return ret;
3000     }
3001
3002   {
3003     tree ar = default_conversion (array);
3004     tree ind = default_conversion (idx);
3005
3006     /* Put the integer in IND to simplify error checking.  */
3007     if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
3008       {
3009         tree temp = ar;
3010         ar = ind;
3011         ind = temp;
3012       }
3013
3014     if (ar == error_mark_node)
3015       return ar;
3016
3017     if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE)
3018       {
3019         if (complain & tf_error)
3020           error_at (loc, "subscripted value is neither array nor pointer");
3021         return error_mark_node;
3022       }
3023     if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
3024       {
3025         if (complain & tf_error)
3026           error_at (loc, "array subscript is not an integer");
3027         return error_mark_node;
3028       }
3029
3030     warn_array_subscript_with_type_char (idx);
3031
3032     ret = cp_build_indirect_ref (cp_build_binary_op (input_location,
3033                                                      PLUS_EXPR, ar, ind,
3034                                                      complain),
3035                                  RO_ARRAY_INDEXING,
3036                                  complain);
3037     protected_set_expr_location (ret, loc);
3038     return ret;
3039   }
3040 }
3041
3042 /* Entry point for Obj-C++.  */
3043
3044 tree
3045 build_array_ref (location_t loc, tree array, tree idx)
3046 {
3047   return cp_build_array_ref (loc, array, idx, tf_warning_or_error);
3048 }
3049 \f
3050 /* Resolve a pointer to member function.  INSTANCE is the object
3051    instance to use, if the member points to a virtual member.
3052
3053    This used to avoid checking for virtual functions if basetype
3054    has no virtual functions, according to an earlier ANSI draft.
3055    With the final ISO C++ rules, such an optimization is
3056    incorrect: A pointer to a derived member can be static_cast
3057    to pointer-to-base-member, as long as the dynamic object
3058    later has the right member.  */
3059
3060 tree
3061 get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
3062 {
3063   if (TREE_CODE (function) == OFFSET_REF)
3064     function = TREE_OPERAND (function, 1);
3065
3066   if (TYPE_PTRMEMFUNC_P (TREE_TYPE (function)))
3067     {
3068       tree idx, delta, e1, e2, e3, vtbl, basetype;
3069       tree fntype = TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (function));
3070
3071       tree instance_ptr = *instance_ptrptr;
3072       tree instance_save_expr = 0;
3073       if (instance_ptr == error_mark_node)
3074         {
3075           if (TREE_CODE (function) == PTRMEM_CST)
3076             {
3077               /* Extracting the function address from a pmf is only
3078                  allowed with -Wno-pmf-conversions. It only works for
3079                  pmf constants.  */
3080               e1 = build_addr_func (PTRMEM_CST_MEMBER (function));
3081               e1 = convert (fntype, e1);
3082               return e1;
3083             }
3084           else
3085             {
3086               error ("object missing in use of %qE", function);
3087               return error_mark_node;
3088             }
3089         }
3090
3091       if (TREE_SIDE_EFFECTS (instance_ptr))
3092         instance_ptr = instance_save_expr = save_expr (instance_ptr);
3093
3094       if (TREE_SIDE_EFFECTS (function))
3095         function = save_expr (function);
3096
3097       /* Start by extracting all the information from the PMF itself.  */
3098       e3 = pfn_from_ptrmemfunc (function);
3099       delta = delta_from_ptrmemfunc (function);
3100       idx = build1 (NOP_EXPR, vtable_index_type, e3);
3101       switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
3102         {
3103         case ptrmemfunc_vbit_in_pfn:
3104           e1 = cp_build_binary_op (input_location,
3105                                    BIT_AND_EXPR, idx, integer_one_node,
3106                                    tf_warning_or_error);
3107           idx = cp_build_binary_op (input_location,
3108                                     MINUS_EXPR, idx, integer_one_node,
3109                                     tf_warning_or_error);
3110           break;
3111
3112         case ptrmemfunc_vbit_in_delta:
3113           e1 = cp_build_binary_op (input_location,
3114                                    BIT_AND_EXPR, delta, integer_one_node,
3115                                    tf_warning_or_error);
3116           delta = cp_build_binary_op (input_location,
3117                                       RSHIFT_EXPR, delta, integer_one_node,
3118                                       tf_warning_or_error);
3119           break;
3120
3121         default:
3122           gcc_unreachable ();
3123         }
3124
3125       /* Convert down to the right base before using the instance.  A
3126          special case is that in a pointer to member of class C, C may
3127          be incomplete.  In that case, the function will of course be
3128          a member of C, and no conversion is required.  In fact,
3129          lookup_base will fail in that case, because incomplete
3130          classes do not have BINFOs.  */
3131       basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
3132       if (!same_type_ignoring_top_level_qualifiers_p
3133           (basetype, TREE_TYPE (TREE_TYPE (instance_ptr))))
3134         {
3135           basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
3136                                   basetype, ba_check, NULL);
3137           instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype,
3138                                           1);
3139           if (instance_ptr == error_mark_node)
3140             return error_mark_node;
3141         }
3142       /* ...and then the delta in the PMF.  */
3143       instance_ptr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (instance_ptr),
3144                              instance_ptr, fold_convert (sizetype, delta));
3145
3146       /* Hand back the adjusted 'this' argument to our caller.  */
3147       *instance_ptrptr = instance_ptr;
3148
3149       /* Next extract the vtable pointer from the object.  */
3150       vtbl = build1 (NOP_EXPR, build_pointer_type (vtbl_ptr_type_node),
3151                      instance_ptr);
3152       vtbl = cp_build_indirect_ref (vtbl, RO_NULL, tf_warning_or_error);
3153       /* If the object is not dynamic the access invokes undefined
3154          behavior.  As it is not executed in this case silence the
3155          spurious warnings it may provoke.  */
3156       TREE_NO_WARNING (vtbl) = 1;
3157
3158       /* Finally, extract the function pointer from the vtable.  */
3159       e2 = fold_build2_loc (input_location,
3160                         POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl,
3161                         fold_convert (sizetype, idx));
3162       e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
3163       TREE_CONSTANT (e2) = 1;
3164
3165       /* When using function descriptors, the address of the
3166          vtable entry is treated as a function pointer.  */
3167       if (TARGET_VTABLE_USES_DESCRIPTORS)
3168         e2 = build1 (NOP_EXPR, TREE_TYPE (e2),
3169                      cp_build_unary_op (ADDR_EXPR, e2, /*noconvert=*/1,
3170                                      tf_warning_or_error));
3171
3172       e2 = fold_convert (TREE_TYPE (e3), e2);
3173       e1 = build_conditional_expr (e1, e2, e3, tf_warning_or_error);
3174
3175       /* Make sure this doesn't get evaluated first inside one of the
3176          branches of the COND_EXPR.  */
3177       if (instance_save_expr)
3178         e1 = build2 (COMPOUND_EXPR, TREE_TYPE (e1),
3179                      instance_save_expr, e1);
3180
3181       function = e1;
3182     }
3183   return function;
3184 }
3185
3186 /* Used by the C-common bits.  */
3187 tree
3188 build_function_call (location_t loc ATTRIBUTE_UNUSED, 
3189                      tree function, tree params)
3190 {
3191   return cp_build_function_call (function, params, tf_warning_or_error);
3192 }
3193
3194 /* Used by the C-common bits.  */
3195 tree
3196 build_function_call_vec (location_t loc ATTRIBUTE_UNUSED,
3197                          tree function, VEC(tree,gc) *params,
3198                          VEC(tree,gc) *origtypes ATTRIBUTE_UNUSED)
3199 {
3200   VEC(tree,gc) *orig_params = params;
3201   tree ret = cp_build_function_call_vec (function, &params,
3202                                          tf_warning_or_error);
3203
3204   /* cp_build_function_call_vec can reallocate PARAMS by adding
3205      default arguments.  That should never happen here.  Verify
3206      that.  */
3207   gcc_assert (params == orig_params);
3208
3209   return ret;
3210 }
3211
3212 /* Build a function call using a tree list of arguments.  */
3213
3214 tree
3215 cp_build_function_call (tree function, tree params, tsubst_flags_t complain)
3216 {
3217   VEC(tree,gc) *vec;
3218   tree ret;
3219
3220   vec = make_tree_vector ();
3221   for (; params != NULL_TREE; params = TREE_CHAIN (params))
3222     VEC_safe_push (tree, gc, vec, TREE_VALUE (params));
3223   ret = cp_build_function_call_vec (function, &vec, complain);
3224   release_tree_vector (vec);
3225   return ret;
3226 }
3227
3228 /* Build a function call using varargs.  */
3229
3230 tree
3231 cp_build_function_call_nary (tree function, tsubst_flags_t complain, ...)
3232 {
3233   VEC(tree,gc) *vec;
3234   va_list args;
3235   tree ret, t;
3236
3237   vec = make_tree_vector ();
3238   va_start (args, complain);
3239   for (t = va_arg (args, tree); t != NULL_TREE; t = va_arg (args, tree))
3240     VEC_safe_push (tree, gc, vec, t);
3241   va_end (args);
3242   ret = cp_build_function_call_vec (function, &vec, complain);
3243   release_tree_vector (vec);
3244   return ret;
3245 }
3246
3247 /* Build a function call using a vector of arguments.  PARAMS may be
3248    NULL if there are no parameters.  This changes the contents of
3249    PARAMS.  */
3250
3251 tree
3252 cp_build_function_call_vec (tree function, VEC(tree,gc) **params,
3253                             tsubst_flags_t complain)
3254 {
3255   tree fntype, fndecl;
3256   int is_method;
3257   tree original = function;
3258   int nargs;
3259   tree *argarray;
3260   tree parm_types;
3261   VEC(tree,gc) *allocated = NULL;
3262   tree ret;
3263
3264   /* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
3265      expressions, like those used for ObjC messenger dispatches.  */
3266   if (params != NULL && !VEC_empty (tree, *params))
3267     function = objc_rewrite_function_call (function,
3268                                            VEC_index (tree, *params, 0));
3269
3270   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
3271      Strip such NOP_EXPRs, since FUNCTION is used in non-lvalue context.  */
3272   if (TREE_CODE (function) == NOP_EXPR
3273       && TREE_TYPE (function) == TREE_TYPE (TREE_OPERAND (function, 0)))
3274     function = TREE_OPERAND (function, 0);
3275
3276   if (TREE_CODE (function) == FUNCTION_DECL)
3277     {
3278       mark_used (function);
3279       fndecl = function;
3280
3281       /* Convert anything with function type to a pointer-to-function.  */
3282       if (DECL_MAIN_P (function) && (complain & tf_error))
3283         pedwarn (input_location, OPT_pedantic, 
3284                  "ISO C++ forbids calling %<::main%> from within program");
3285
3286       function = build_addr_func (function);
3287     }
3288   else
3289     {
3290       fndecl = NULL_TREE;
3291
3292       function = build_addr_func (function);
3293     }
3294
3295   if (function == error_mark_node)
3296     return error_mark_node;
3297
3298   fntype = TREE_TYPE (function);
3299
3300   if (TYPE_PTRMEMFUNC_P (fntype))
3301     {
3302       if (complain & tf_error)
3303         error ("must use %<.*%> or %<->*%> to call pointer-to-member "
3304                "function in %<%E (...)%>, e.g. %<(... ->* %E) (...)%>",
3305                original, original);
3306       return error_mark_node;
3307     }
3308
3309   is_method = (TREE_CODE (fntype) == POINTER_TYPE
3310                && TREE_CODE (TREE_TYPE (fntype)) == METHOD_TYPE);
3311
3312   if (!((TREE_CODE (fntype) == POINTER_TYPE
3313          && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE)
3314         || is_method
3315         || TREE_CODE (function) == TEMPLATE_ID_EXPR))
3316     {
3317       if (complain & tf_error)
3318         error ("%qE cannot be used as a function", original);
3319       return error_mark_node;
3320     }
3321
3322   /* fntype now gets the type of function pointed to.  */
3323   fntype = TREE_TYPE (fntype);
3324   parm_types = TYPE_ARG_TYPES (fntype);
3325
3326   if (params == NULL)
3327     {
3328       allocated = make_tree_vector ();
3329       params = &allocated;
3330     }
3331
3332   nargs = convert_arguments (parm_types, params, fndecl, LOOKUP_NORMAL,
3333                              complain);
3334   if (nargs < 0)
3335     return error_mark_node;
3336
3337   argarray = VEC_address (tree, *params);
3338
3339   /* Check for errors in format strings and inappropriately
3340      null parameters.  */
3341   check_function_arguments (TYPE_ATTRIBUTES (fntype), nargs, argarray,
3342                             parm_types);
3343
3344   ret = build_cxx_call (function, nargs, argarray);
3345
3346   if (allocated != NULL)
3347     release_tree_vector (allocated);
3348
3349   return ret;
3350 }
3351 \f
3352 /* Subroutine of convert_arguments.
3353    Warn about wrong number of args are genereted. */
3354
3355 static void
3356 warn_args_num (location_t loc, tree fndecl, bool too_many_p)
3357 {
3358   if (fndecl)
3359     {
3360       if (TREE_CODE (TREE_TYPE (fndecl)) == METHOD_TYPE)
3361         {
3362           if (DECL_NAME (fndecl) == NULL_TREE
3363               || IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (fndecl)))
3364             error_at (loc,
3365                       too_many_p
3366                       ? G_("too many arguments to constructor %q#D")
3367                       : G_("too few arguments to constructor %q#D"),
3368                       fndecl);
3369           else
3370             error_at (loc,
3371                       too_many_p
3372                       ? G_("too many arguments to member function %q#D")
3373                       : G_("too few arguments to member function %q#D"),
3374                       fndecl);
3375         }
3376       else
3377         error_at (loc,
3378                   too_many_p
3379                   ? G_("too many arguments to function %q#D")
3380                   : G_("too few arguments to function %q#D"),
3381                   fndecl);
3382       inform (DECL_SOURCE_LOCATION (fndecl),
3383               "declared here");
3384     }
3385   else
3386     error_at (loc, too_many_p ? G_("too many arguments to function")
3387                               : G_("too few arguments to function"));
3388 }
3389
3390 /* Convert the actual parameter expressions in the list VALUES to the
3391    types in the list TYPELIST.  The converted expressions are stored
3392    back in the VALUES vector.
3393    If parmdecls is exhausted, or when an element has NULL as its type,
3394    perform the default conversions.
3395
3396    NAME is an IDENTIFIER_NODE or 0.  It is used only for error messages.
3397
3398    This is also where warnings about wrong number of args are generated.
3399
3400    Returns the actual number of arguments processed (which might be less
3401    than the length of the vector), or -1 on error.
3402
3403    In C++, unspecified trailing parameters can be filled in with their
3404    default arguments, if such were specified.  Do so here.  */
3405
3406 static int
3407 convert_arguments (tree typelist, VEC(tree,gc) **values, tree fndecl,
3408                    int flags, tsubst_flags_t complain)
3409 {
3410   tree typetail;
3411   unsigned int i;
3412
3413   /* Argument passing is always copy-initialization.  */
3414   flags |= LOOKUP_ONLYCONVERTING;
3415
3416   for (i = 0, typetail = typelist;
3417        i < VEC_length (tree, *values);
3418        i++)
3419     {
3420       tree type = typetail ? TREE_VALUE (typetail) : 0;
3421       tree val = VEC_index (tree, *values, i);
3422
3423       if (val == error_mark_node || type == error_mark_node)
3424         return -1;
3425
3426       if (type == void_type_node)
3427         {
3428           if (complain & tf_error)
3429             {
3430               warn_args_num (input_location, fndecl, /*too_many_p=*/true);
3431               return i;
3432             }
3433           else
3434             return -1;
3435         }
3436
3437       /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
3438          Strip such NOP_EXPRs, since VAL is used in non-lvalue context.  */
3439       if (TREE_CODE (val) == NOP_EXPR
3440           && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))
3441           && (type == 0 || TREE_CODE (type) != REFERENCE_TYPE))
3442         val = TREE_OPERAND (val, 0);
3443
3444       if (type == 0 || TREE_CODE (type) != REFERENCE_TYPE)
3445         {
3446           if (TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE
3447               || TREE_CODE (TREE_TYPE (val)) == FUNCTION_TYPE
3448               || TREE_CODE (TREE_TYPE (val)) == METHOD_TYPE)
3449             val = decay_conversion (val);
3450         }
3451
3452       if (val == error_mark_node)
3453         return -1;
3454
3455       if (type != 0)
3456         {
3457           /* Formal parm type is specified by a function prototype.  */
3458           tree parmval;
3459
3460           if (!COMPLETE_TYPE_P (complete_type (type)))
3461             {
3462               if (complain & tf_error)
3463                 {
3464                   if (fndecl)
3465                     error ("parameter %P of %qD has incomplete type %qT",
3466                            i, fndecl, type);
3467                   else
3468                     error ("parameter %P has incomplete type %qT", i, type);
3469                 }
3470               parmval = error_mark_node;
3471             }
3472           else
3473             {
3474               parmval = convert_for_initialization
3475                 (NULL_TREE, type, val, flags,
3476                  "argument passing", fndecl, i, complain);
3477               parmval = convert_for_arg_passing (type, parmval);
3478             }
3479
3480           if (parmval == error_mark_node)
3481             return -1;
3482
3483           VEC_replace (tree, *values, i, parmval);
3484         }
3485       else
3486         {
3487           if (fndecl && DECL_BUILT_IN (fndecl)
3488               && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CONSTANT_P)
3489             /* Don't do ellipsis conversion for __built_in_constant_p
3490                as this will result in spurious errors for non-trivial
3491                types.  */
3492             val = require_complete_type (val);
3493           else
3494             val = convert_arg_to_ellipsis (val);
3495
3496           VEC_replace (tree, *values, i, val);
3497         }
3498
3499       if (typetail)
3500         typetail = TREE_CHAIN (typetail);
3501     }
3502
3503   if (typetail != 0 && typetail != void_list_node)
3504     {
3505       /* See if there are default arguments that can be used.  Because
3506          we hold default arguments in the FUNCTION_TYPE (which is so
3507          wrong), we can see default parameters here from deduced
3508          contexts (and via typeof) for indirect function calls.
3509          Fortunately we know whether we have a function decl to
3510          provide default arguments in a language conformant
3511          manner.  */
3512       if (fndecl && TREE_PURPOSE (typetail)
3513           && TREE_CODE (TREE_PURPOSE (typetail)) != DEFAULT_ARG)
3514         {
3515           for (; typetail != void_list_node; ++i)
3516             {
3517               tree parmval
3518                 = convert_default_arg (TREE_VALUE (typetail),
3519                                        TREE_PURPOSE (typetail),
3520                                        fndecl, i);
3521
3522               if (parmval == error_mark_node)
3523                 return -1;
3524
3525               VEC_safe_push (tree, gc, *values, parmval);
3526               typetail = TREE_CHAIN (typetail);
3527               /* ends with `...'.  */
3528               if (typetail == NULL_TREE)
3529                 break;
3530             }
3531         }
3532       else
3533         {
3534           if (complain & tf_error)
3535             warn_args_num (input_location, fndecl, /*too_many_p=*/false);
3536           return -1;
3537         }
3538     }
3539
3540   return (int) i;
3541 }
3542 \f
3543 /* Build a binary-operation expression, after performing default
3544    conversions on the operands.  CODE is the kind of expression to
3545    build.  ARG1 and ARG2 are the arguments.  ARG1_CODE and ARG2_CODE
3546    are the tree codes which correspond to ARG1 and ARG2 when issuing
3547    warnings about possibly misplaced parentheses.  They may differ
3548    from the TREE_CODE of ARG1 and ARG2 if the parser has done constant
3549    folding (e.g., if the parser sees "a | 1 + 1", it may call this
3550    routine with ARG2 being an INTEGER_CST and ARG2_CODE == PLUS_EXPR).
3551    To avoid issuing any parentheses warnings, pass ARG1_CODE and/or
3552    ARG2_CODE as ERROR_MARK.  */
3553
3554 tree
3555 build_x_binary_op (enum tree_code code, tree arg1, enum tree_code arg1_code,
3556                    tree arg2, enum tree_code arg2_code, bool *overloaded_p,
3557                    tsubst_flags_t complain)
3558 {
3559   tree orig_arg1;
3560   tree orig_arg2;
3561   tree expr;
3562
3563   orig_arg1 = arg1;
3564   orig_arg2 = arg2;
3565
3566   if (processing_template_decl)
3567     {
3568       if (type_dependent_expression_p (arg1)
3569           || type_dependent_expression_p (arg2))
3570         return build_min_nt (code, arg1, arg2);
3571       arg1 = build_non_dependent_expr (arg1);
3572       arg2 = build_non_dependent_expr (arg2);
3573     }
3574
3575   if (code == DOTSTAR_EXPR)
3576     expr = build_m_component_ref (arg1, arg2);
3577   else
3578     expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
3579                          overloaded_p, complain);
3580
3581   /* Check for cases such as x+y<<z which users are likely to
3582      misinterpret.  But don't warn about obj << x + y, since that is a
3583      common idiom for I/O.  */
3584   if (warn_parentheses
3585       && (complain & tf_warning)
3586       && !processing_template_decl
3587       && !error_operand_p (arg1)
3588       && !error_operand_p (arg2)
3589       && (code != LSHIFT_EXPR
3590           || !CLASS_TYPE_P (TREE_TYPE (arg1))))
3591     warn_about_parentheses (code, arg1_code, orig_arg1, arg2_code, orig_arg2);
3592
3593   if (processing_template_decl && expr != error_mark_node)
3594     return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
3595
3596   return expr;
3597 }
3598
3599 /* Build and return an ARRAY_REF expression.  */
3600
3601 tree
3602 build_x_array_ref (tree arg1, tree arg2, tsubst_flags_t complain)
3603 {
3604   tree orig_arg1 = arg1;
3605   tree orig_arg2 = arg2;
3606   tree expr;
3607
3608   if (processing_template_decl)
3609     {
3610       if (type_dependent_expression_p (arg1)
3611           || type_dependent_expression_p (arg2))
3612         return build_min_nt (ARRAY_REF, arg1, arg2,
3613                              NULL_TREE, NULL_TREE);
3614       arg1 = build_non_dependent_expr (arg1);
3615       arg2 = build_non_dependent_expr (arg2);
3616     }
3617
3618   expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
3619                        /*overloaded_p=*/NULL, complain);
3620
3621   if (processing_template_decl && expr != error_mark_node)
3622     return build_min_non_dep (ARRAY_REF, expr, orig_arg1, orig_arg2,
3623                               NULL_TREE, NULL_TREE);
3624   return expr;
3625 }
3626
3627 /* For the c-common bits.  */
3628 tree
3629 build_binary_op (location_t location, enum tree_code code, tree op0, tree op1,
3630                  int convert_p ATTRIBUTE_UNUSED)
3631 {
3632   return cp_build_binary_op (location, code, op0, op1, tf_warning_or_error);
3633 }
3634
3635
3636 /* Build a binary-operation expression without default conversions.
3637    CODE is the kind of expression to build.
3638    LOCATION is the location_t of the operator in the source code.
3639    This function differs from `build' in several ways:
3640    the data type of the result is computed and recorded in it,
3641    warnings are generated if arg data types are invalid,
3642    special handling for addition and subtraction of pointers is known,
3643    and some optimization is done (operations on narrow ints
3644    are done in the narrower type when that gives the same result).
3645    Constant folding is also done before the result is returned.
3646
3647    Note that the operands will never have enumeral types
3648    because either they have just had the default conversions performed
3649    or they have both just been converted to some other type in which
3650    the arithmetic is to be done.
3651
3652    C++: must do special pointer arithmetic when implementing
3653    multiple inheritance, and deal with pointer to member functions.  */
3654
3655 tree
3656 cp_build_binary_op (location_t location,
3657                     enum tree_code code, tree orig_op0, tree orig_op1,
3658                     tsubst_flags_t complain)
3659 {
3660   tree op0, op1;
3661   enum tree_code code0, code1;
3662   tree type0, type1;
3663   const char *invalid_op_diag;
3664
3665   /* Expression code to give to the expression when it is built.
3666      Normally this is CODE, which is what the caller asked for,
3667      but in some special cases we change it.  */
3668   enum tree_code resultcode = code;
3669
3670   /* Data type in which the computation is to be performed.
3671      In the simplest cases this is the common type of the arguments.  */
3672   tree result_type = NULL;
3673
3674   /* Nonzero means operands have already been type-converted
3675      in whatever way is necessary.
3676      Zero means they need to be converted to RESULT_TYPE.  */
3677   int converted = 0;
3678
3679   /* Nonzero means create the expression with this type, rather than
3680      RESULT_TYPE.  */
3681   tree build_type = 0;
3682
3683   /* Nonzero means after finally constructing the expression
3684      convert it to this type.  */
3685   tree final_type = 0;
3686
3687   tree result;
3688
3689   /* Nonzero if this is an operation like MIN or MAX which can
3690      safely be computed in short if both args are promoted shorts.
3691      Also implies COMMON.
3692      -1 indicates a bitwise operation; this makes a difference
3693      in the exact conditions for when it is safe to do the operation
3694      in a narrower mode.  */
3695   int shorten = 0;
3696
3697   /* Nonzero if this is a comparison operation;
3698      if both args are promoted shorts, compare the original shorts.
3699      Also implies COMMON.  */
3700   int short_compare = 0;
3701
3702   /* Nonzero means set RESULT_TYPE to the common type of the args.  */
3703   int common = 0;
3704
3705   /* True if both operands have arithmetic type.  */
3706   bool arithmetic_types_p;
3707
3708   /* Apply default conversions.  */
3709   op0 = orig_op0;
3710   op1 = orig_op1;
3711
3712   if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
3713       || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
3714       || code == TRUTH_XOR_EXPR)
3715     {
3716       if (!really_overloaded_fn (op0))
3717         op0 = decay_conversion (op0);
3718       if (!really_overloaded_fn (op1))
3719         op1 = decay_conversion (op1);
3720     }
3721   else
3722     {
3723       if (!really_overloaded_fn (op0))
3724         op0 = default_conversion (op0);
3725       if (!really_overloaded_fn (op1))
3726         op1 = default_conversion (op1);
3727     }
3728
3729   /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
3730   STRIP_TYPE_NOPS (op0);
3731   STRIP_TYPE_NOPS (op1);
3732
3733   /* DTRT if one side is an overloaded function, but complain about it.  */
3734   if (type_unknown_p (op0))
3735     {
3736       tree t = instantiate_type (TREE_TYPE (op1), op0, tf_none);
3737       if (t != error_mark_node)
3738         {
3739           if (complain & tf_error)
3740             permerror (input_location, "assuming cast to type %qT from overloaded function",
3741                        TREE_TYPE (t));
3742           op0 = t;
3743         }
3744     }
3745   if (type_unknown_p (op1))
3746     {
3747       tree t = instantiate_type (TREE_TYPE (op0), op1, tf_none);
3748       if (t != error_mark_node)
3749         {
3750           if (complain & tf_error)
3751             permerror (input_location, "assuming cast to type %qT from overloaded function",
3752                        TREE_TYPE (t));
3753           op1 = t;
3754         }
3755     }
3756
3757   type0 = TREE_TYPE (op0);
3758   type1 = TREE_TYPE (op1);
3759
3760   /* The expression codes of the data types of the arguments tell us
3761      whether the arguments are integers, floating, pointers, etc.  */
3762   code0 = TREE_CODE (type0);
3763   code1 = TREE_CODE (type1);
3764
3765   /* If an error was already reported for one of the arguments,
3766      avoid reporting another error.  */
3767   if (code0 == ERROR_MARK || code1 == ERROR_MARK)
3768     return error_mark_node;
3769
3770   if ((invalid_op_diag
3771        = targetm.invalid_binary_op (code, type0, type1)))
3772     {
3773       error (invalid_op_diag);
3774       return error_mark_node;
3775     }
3776
3777   /* Issue warnings about peculiar, but valid, uses of NULL.  */
3778   if ((orig_op0 == null_node || orig_op1 == null_node)
3779       /* It's reasonable to use pointer values as operands of &&
3780          and ||, so NULL is no exception.  */
3781       && code != TRUTH_ANDIF_EXPR && code != TRUTH_ORIF_EXPR 
3782       && ( /* Both are NULL (or 0) and the operation was not a
3783               comparison or a pointer subtraction.  */
3784           (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1) 
3785            && code != EQ_EXPR && code != NE_EXPR && code != MINUS_EXPR) 
3786           /* Or if one of OP0 or OP1 is neither a pointer nor NULL.  */
3787           || (!null_ptr_cst_p (orig_op0)
3788               && !TYPE_PTR_P (type0) && !TYPE_PTR_TO_MEMBER_P (type0))
3789           || (!null_ptr_cst_p (orig_op1) 
3790               && !TYPE_PTR_P (type1) && !TYPE_PTR_TO_MEMBER_P (type1)))
3791       && (complain & tf_warning))
3792     /* Some sort of arithmetic operation involving NULL was
3793        performed.  */
3794     warning (OPT_Wpointer_arith, "NULL used in arithmetic");
3795
3796   switch (code)
3797     {
3798     case MINUS_EXPR:
3799       /* Subtraction of two similar pointers.
3800          We must subtract them as integers, then divide by object size.  */
3801       if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
3802           && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
3803                                                         TREE_TYPE (type1)))
3804         return pointer_diff (op0, op1, common_pointer_type (type0, type1));
3805       /* In all other cases except pointer - int, the usual arithmetic
3806          rules apply.  */
3807       else if (!(code0 == POINTER_TYPE && code1 == INTEGER_TYPE))
3808         {
3809           common = 1;
3810           break;
3811         }
3812       /* The pointer - int case is just like pointer + int; fall
3813          through.  */
3814     case PLUS_EXPR:
3815       if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
3816           && (code0 == INTEGER_TYPE || code1 == INTEGER_TYPE))
3817         {
3818           tree ptr_operand;
3819           tree int_operand;
3820           ptr_operand = ((code0 == POINTER_TYPE) ? op0 : op1);
3821           int_operand = ((code0 == INTEGER_TYPE) ? op0 : op1);
3822           if (processing_template_decl)
3823             {
3824               result_type = TREE_TYPE (ptr_operand);
3825               break;
3826             }
3827           return cp_pointer_int_sum (code,
3828                                      ptr_operand, 
3829                                      int_operand);
3830         }
3831       common = 1;
3832       break;
3833
3834     case MULT_EXPR:
3835       common = 1;
3836       break;
3837
3838     case TRUNC_DIV_EXPR:
3839     case CEIL_DIV_EXPR:
3840     case FLOOR_DIV_EXPR:
3841     case ROUND_DIV_EXPR:
3842     case EXACT_DIV_EXPR:
3843       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
3844            || code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
3845           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
3846               || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
3847         {
3848           enum tree_code tcode0 = code0, tcode1 = code1;
3849
3850           warn_for_div_by_zero (location, op1);
3851
3852           if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE)
3853             tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
3854           if (tcode1 == COMPLEX_TYPE || tcode1 == VECTOR_TYPE)
3855             tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
3856
3857           if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
3858             resultcode = RDIV_EXPR;
3859           else
3860             /* When dividing two signed integers, we have to promote to int.
3861                unless we divide by a constant != -1.  Note that default
3862                conversion will have been performed on the operands at this
3863                point, so we have to dig out the original type to find out if
3864                it was unsigned.  */
3865             shorten = ((TREE_CODE (op0) == NOP_EXPR
3866                         && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3867                        || (TREE_CODE (op1) == INTEGER_CST
3868                            && ! integer_all_onesp (op1)));
3869
3870           common = 1;
3871         }
3872       break;
3873
3874     case BIT_AND_EXPR:
3875     case BIT_IOR_EXPR:
3876     case BIT_XOR_EXPR:
3877       if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3878           || (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
3879               && !VECTOR_FLOAT_TYPE_P (type0)
3880               && !VECTOR_FLOAT_TYPE_P (type1)))
3881         shorten = -1;
3882       break;
3883
3884     case TRUNC_MOD_EXPR:
3885     case FLOOR_MOD_EXPR:
3886       warn_for_div_by_zero (location, op1);
3887
3888       if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
3889           && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
3890           && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE)
3891         common = 1;
3892       else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3893         {
3894           /* Although it would be tempting to shorten always here, that loses
3895              on some targets, since the modulo instruction is undefined if the
3896              quotient can't be represented in the computation mode.  We shorten
3897              only if unsigned or if dividing by something we know != -1.  */
3898           shorten = ((TREE_CODE (op0) == NOP_EXPR
3899                       && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (op0, 0))))
3900                      || (TREE_CODE (op1) == INTEGER_CST
3901                          && ! integer_all_onesp (op1)));
3902           common = 1;
3903         }
3904       break;
3905
3906     case TRUTH_ANDIF_EXPR:
3907     case TRUTH_ORIF_EXPR:
3908     case TRUTH_AND_EXPR:
3909     case TRUTH_OR_EXPR:
3910       result_type = boolean_type_node;
3911       break;
3912
3913       /* Shift operations: result has same type as first operand;
3914          always convert second operand to int.
3915          Also set SHORT_SHIFT if shifting rightward.  */
3916
3917     case RSHIFT_EXPR:
3918       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3919         {
3920           result_type = type0;
3921           if (TREE_CODE (op1) == INTEGER_CST)
3922             {
3923               if (tree_int_cst_lt (op1, integer_zero_node))
3924                 {
3925                   if ((complain & tf_warning)
3926                       && c_inhibit_evaluation_warnings == 0)
3927                     warning (0, "right shift count is negative");
3928                 }
3929               else
3930                 {
3931                   if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0
3932                       && (complain & tf_warning)
3933                       && c_inhibit_evaluation_warnings == 0)
3934                     warning (0, "right shift count >= width of type");
3935                 }
3936             }
3937           /* Convert the shift-count to an integer, regardless of
3938              size of value being shifted.  */
3939           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3940             op1 = cp_convert (integer_type_node, op1);
3941           /* Avoid converting op1 to result_type later.  */
3942           converted = 1;
3943         }
3944       break;
3945
3946     case LSHIFT_EXPR:
3947       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3948         {
3949           result_type = type0;
3950           if (TREE_CODE (op1) == INTEGER_CST)
3951             {
3952               if (tree_int_cst_lt (op1, integer_zero_node))
3953                 {
3954                   if ((complain & tf_warning)
3955                       && c_inhibit_evaluation_warnings == 0)
3956                     warning (0, "left shift count is negative");
3957                 }
3958               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
3959                 {
3960                   if ((complain & tf_warning)
3961                       && c_inhibit_evaluation_warnings == 0)
3962                     warning (0, "left shift count >= width of type");
3963                 }
3964             }
3965           /* Convert the shift-count to an integer, regardless of
3966              size of value being shifted.  */
3967           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3968             op1 = cp_convert (integer_type_node, op1);
3969           /* Avoid converting op1 to result_type later.  */
3970           converted = 1;
3971         }
3972       break;
3973
3974     case RROTATE_EXPR:
3975     case LROTATE_EXPR:
3976       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
3977         {
3978           result_type = type0;
3979           if (TREE_CODE (op1) == INTEGER_CST)
3980             {
3981               if (tree_int_cst_lt (op1, integer_zero_node))
3982                 {
3983                   if (complain & tf_warning)
3984                     warning (0, (code == LROTATE_EXPR)
3985                                   ? G_("left rotate count is negative")
3986                                   : G_("right rotate count is negative"));
3987                 }
3988               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
3989                 {
3990                   if (complain & tf_warning)
3991                     warning (0, (code == LROTATE_EXPR) 
3992                                   ? G_("left rotate count >= width of type")
3993                                   : G_("right rotate count >= width of type"));
3994                 }
3995             }
3996           /* Convert the shift-count to an integer, regardless of
3997              size of value being shifted.  */
3998           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
3999             op1 = cp_convert (integer_type_node, op1);
4000         }
4001       break;
4002
4003     case EQ_EXPR:
4004     case NE_EXPR:
4005       if ((complain & tf_warning)
4006           && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
4007         warning (OPT_Wfloat_equal,
4008                  "comparing floating point with == or != is unsafe");
4009       if ((complain & tf_warning)
4010           && ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
4011               || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))))
4012         warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
4013
4014       build_type = boolean_type_node;
4015       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
4016            || code0 == COMPLEX_TYPE || code0 == ENUMERAL_TYPE)
4017           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
4018               || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE))
4019         short_compare = 1;
4020       else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE)
4021                || (TYPE_PTRMEM_P (type0) && TYPE_PTRMEM_P (type1)))
4022         result_type = composite_pointer_type (type0, type1, op0, op1,
4023                                               CPO_COMPARISON, complain);
4024       else if ((code0 == POINTER_TYPE || TYPE_PTRMEM_P (type0))
4025                && null_ptr_cst_p (op1))
4026         {
4027           if (TREE_CODE (op0) == ADDR_EXPR
4028               && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0)))
4029             {
4030               if (complain & tf_warning)
4031                 warning (OPT_Waddress, "the address of %qD will never be NULL",
4032                          TREE_OPERAND (op0, 0));
4033             }
4034           result_type = type0;
4035         }
4036       else if ((code1 == POINTER_TYPE || TYPE_PTRMEM_P (type1))
4037                && null_ptr_cst_p (op0))
4038         {
4039           if (TREE_CODE (op1) == ADDR_EXPR 
4040               && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0)))
4041             {
4042               if (complain & tf_warning)
4043                 warning (OPT_Waddress, "the address of %qD will never be NULL",
4044                          TREE_OPERAND (op1, 0));
4045             }
4046           result_type = type1;
4047         }
4048       else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1))
4049         /* One of the operands must be of nullptr_t type.  */
4050         result_type = TREE_TYPE (nullptr_node);
4051       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
4052         {
4053           result_type = type0;
4054           if (complain & tf_error) 
4055             permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
4056           else
4057             return error_mark_node;
4058         }
4059       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
4060         {
4061           result_type = type1;
4062           if (complain & tf_error)
4063             permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
4064           else
4065             return error_mark_node;
4066         }
4067       else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (op1))
4068         {
4069           if (TARGET_PTRMEMFUNC_VBIT_LOCATION
4070               == ptrmemfunc_vbit_in_delta)
4071             {
4072               tree pfn0 = pfn_from_ptrmemfunc (op0);
4073               tree delta0 = delta_from_ptrmemfunc (op0);
4074               tree e1 = cp_build_binary_op (location,
4075                                             EQ_EXPR,
4076                                             pfn0,       
4077                                             fold_convert (TREE_TYPE (pfn0),
4078                                                           integer_zero_node),
4079                                             complain);
4080               tree e2 = cp_build_binary_op (location,
4081                                             BIT_AND_EXPR, 
4082                                             delta0,
4083                                             integer_one_node,
4084                                             complain);
4085               e2 = cp_build_binary_op (location,
4086                                        EQ_EXPR, e2, integer_zero_node,
4087                                        complain);
4088               op0 = cp_build_binary_op (location,
4089                                         TRUTH_ANDIF_EXPR, e1, e2,
4090                                         complain);
4091               op1 = cp_convert (TREE_TYPE (op0), integer_one_node); 
4092             }
4093           else 
4094             {
4095               op0 = build_ptrmemfunc_access_expr (op0, pfn_identifier);
4096               op1 = cp_convert (TREE_TYPE (op0), integer_zero_node); 
4097             }
4098           result_type = TREE_TYPE (op0);
4099         }
4100       else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (op0))
4101         return cp_build_binary_op (location, code, op1, op0, complain);
4102       else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1))
4103         {
4104           tree type;
4105           /* E will be the final comparison.  */
4106           tree e;
4107           /* E1 and E2 are for scratch.  */
4108           tree e1;
4109           tree e2;
4110           tree pfn0;
4111           tree pfn1;
4112           tree delta0;
4113           tree delta1;
4114
4115           type = composite_pointer_type (type0, type1, op0, op1, 
4116                                          CPO_COMPARISON, complain);
4117
4118           if (!same_type_p (TREE_TYPE (op0), type))
4119             op0 = cp_convert_and_check (type, op0);
4120           if (!same_type_p (TREE_TYPE (op1), type))
4121             op1 = cp_convert_and_check (type, op1);
4122
4123           if (op0 == error_mark_node || op1 == error_mark_node)
4124             return error_mark_node;
4125
4126           if (TREE_SIDE_EFFECTS (op0))
4127             op0 = save_expr (op0);
4128           if (TREE_SIDE_EFFECTS (op1))
4129             op1 = save_expr (op1);
4130
4131           pfn0 = pfn_from_ptrmemfunc (op0);
4132           pfn1 = pfn_from_ptrmemfunc (op1);
4133           delta0 = delta_from_ptrmemfunc (op0);
4134           delta1 = delta_from_ptrmemfunc (op1);
4135           if (TARGET_PTRMEMFUNC_VBIT_LOCATION
4136               == ptrmemfunc_vbit_in_delta)
4137             {
4138               /* We generate:
4139
4140                  (op0.pfn == op1.pfn
4141                   && ((op0.delta == op1.delta)
4142                        || (!op0.pfn && op0.delta & 1 == 0 
4143                            && op1.delta & 1 == 0))
4144
4145                  The reason for the `!op0.pfn' bit is that a NULL
4146                  pointer-to-member is any member with a zero PFN and
4147                  LSB of the DELTA field is 0.  */
4148
4149               e1 = cp_build_binary_op (location, BIT_AND_EXPR,
4150                                        delta0, 
4151                                        integer_one_node,
4152                                        complain);
4153               e1 = cp_build_binary_op (location,
4154                                        EQ_EXPR, e1, integer_zero_node,
4155                                        complain);
4156               e2 = cp_build_binary_op (location, BIT_AND_EXPR,
4157                                        delta1,
4158                                        integer_one_node,
4159                                        complain);
4160               e2 = cp_build_binary_op (location,
4161                                        EQ_EXPR, e2, integer_zero_node,
4162                                        complain);
4163               e1 = cp_build_binary_op (location,
4164                                        TRUTH_ANDIF_EXPR, e2, e1,
4165                                        complain);
4166               e2 = cp_build_binary_op (location, EQ_EXPR,
4167                                        pfn0,
4168                                        fold_convert (TREE_TYPE (pfn0),
4169                                                      integer_zero_node),
4170                                        complain);
4171               e2 = cp_build_binary_op (location,
4172                                        TRUTH_ANDIF_EXPR, e2, e1, complain);
4173               e1 = cp_build_binary_op (location,
4174                                        EQ_EXPR, delta0, delta1, complain);
4175               e1 = cp_build_binary_op (location,
4176                                        TRUTH_ORIF_EXPR, e1, e2, complain);
4177             }
4178           else
4179             {
4180               /* We generate:
4181
4182                  (op0.pfn == op1.pfn
4183                  && (!op0.pfn || op0.delta == op1.delta))
4184
4185                  The reason for the `!op0.pfn' bit is that a NULL
4186                  pointer-to-member is any member with a zero PFN; the
4187                  DELTA field is unspecified.  */
4188  
4189               e1 = cp_build_binary_op (location,
4190                                        EQ_EXPR, delta0, delta1, complain);
4191               e2 = cp_build_binary_op (location,
4192                                        EQ_EXPR,
4193                                        pfn0,
4194                                        fold_convert (TREE_TYPE (pfn0),
4195                                                      integer_zero_node),
4196                                        complain);
4197               e1 = cp_build_binary_op (location,
4198                                        TRUTH_ORIF_EXPR, e1, e2, complain);
4199             }
4200           e2 = build2 (EQ_EXPR, boolean_type_node, pfn0, pfn1);
4201           e = cp_build_binary_op (location,
4202                                   TRUTH_ANDIF_EXPR, e2, e1, complain);
4203           if (code == EQ_EXPR)
4204             return e;
4205           return cp_build_binary_op (location,
4206                                      EQ_EXPR, e, integer_zero_node, complain);
4207         }
4208       else
4209         {
4210           gcc_assert (!TYPE_PTRMEMFUNC_P (type0)
4211                       || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type0),
4212                                        type1));
4213           gcc_assert (!TYPE_PTRMEMFUNC_P (type1)
4214                       || !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1),
4215                                        type0));
4216         }
4217
4218       break;
4219
4220     case MAX_EXPR:
4221     case MIN_EXPR:
4222       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
4223            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
4224         shorten = 1;
4225       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
4226         result_type = composite_pointer_type (type0, type1, op0, op1,
4227                                               CPO_COMPARISON, complain);
4228       break;
4229
4230     case LE_EXPR:
4231     case GE_EXPR:
4232     case LT_EXPR:
4233     case GT_EXPR:
4234       if (TREE_CODE (orig_op0) == STRING_CST
4235           || TREE_CODE (orig_op1) == STRING_CST)
4236         {
4237           if (complain & tf_warning)
4238             warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
4239         }
4240
4241       build_type = boolean_type_node;
4242       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
4243            || code0 == ENUMERAL_TYPE)
4244            && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
4245                || code1 == ENUMERAL_TYPE))
4246         short_compare = 1;
4247       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
4248         result_type = composite_pointer_type (type0, type1, op0, op1,
4249                                               CPO_COMPARISON, complain);
4250       else if (code0 == POINTER_TYPE && null_ptr_cst_p (op1))
4251         result_type = type0;
4252       else if (code1 == POINTER_TYPE && null_ptr_cst_p (op0))
4253         result_type = type1;
4254       else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1))
4255         /* One of the operands must be of nullptr_t type.  */
4256         result_type = TREE_TYPE (nullptr_node);
4257       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
4258         {
4259           result_type = type0;
4260           if (complain & tf_error)
4261             permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
4262           else
4263             return error_mark_node;
4264         }
4265       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
4266         {
4267           result_type = type1;
4268           if (complain & tf_error)
4269             permerror (input_location, "ISO C++ forbids comparison between pointer and integer");
4270           else
4271             return error_mark_node;
4272         }
4273       break;
4274
4275     case UNORDERED_EXPR:
4276     case ORDERED_EXPR:
4277     case UNLT_EXPR:
4278     case UNLE_EXPR:
4279     case UNGT_EXPR:
4280     case UNGE_EXPR:
4281     case UNEQ_EXPR:
4282       build_type = integer_type_node;
4283       if (code0 != REAL_TYPE || code1 != REAL_TYPE)
4284         {
4285           if (complain & tf_error)
4286             error ("unordered comparison on non-floating point argument");
4287           return error_mark_node;
4288         }
4289       common = 1;
4290       break;
4291
4292     default:
4293       break;
4294     }
4295
4296   if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE
4297         || code0 == ENUMERAL_TYPE)
4298        && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
4299            || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE)))
4300     arithmetic_types_p = 1;
4301   else
4302     {
4303       arithmetic_types_p = 0;
4304       /* Vector arithmetic is only allowed when both sides are vectors.  */
4305       if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
4306         {
4307           if (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
4308               || !same_scalar_type_ignoring_signedness (TREE_TYPE (type0),
4309                                                         TREE_TYPE (type1)))
4310             {
4311               binary_op_error (location, code, type0, type1);
4312               return error_mark_node;
4313             }
4314           arithmetic_types_p = 1;
4315         }
4316     }
4317   /* Determine the RESULT_TYPE, if it is not already known.  */
4318   if (!result_type
4319       && arithmetic_types_p
4320       && (shorten || common || short_compare))
4321     result_type = cp_common_type (type0, type1);
4322
4323   if (!result_type)
4324     {
4325       if (complain & tf_error)
4326         error ("invalid operands of types %qT and %qT to binary %qO",
4327                TREE_TYPE (orig_op0), TREE_TYPE (orig_op1), code);
4328       return error_mark_node;
4329     }
4330
4331   /* If we're in a template, the only thing we need to know is the
4332      RESULT_TYPE.  */
4333   if (processing_template_decl)
4334     {
4335       /* Since the middle-end checks the type when doing a build2, we
4336          need to build the tree in pieces.  This built tree will never
4337          get out of the front-end as we replace it when instantiating
4338          the template.  */
4339       tree tmp = build2 (resultcode,
4340                          build_type ? build_type : result_type,
4341                          NULL_TREE, op1);
4342       TREE_OPERAND (tmp, 0) = op0;
4343       return tmp;
4344     }
4345
4346   if (arithmetic_types_p)
4347     {
4348       bool first_complex = (code0 == COMPLEX_TYPE);
4349       bool second_complex = (code1 == COMPLEX_TYPE);
4350       int none_complex = (!first_complex && !second_complex);
4351
4352       /* Adapted from patch for c/24581.  */
4353       if (first_complex != second_complex
4354           && (code == PLUS_EXPR
4355               || code == MINUS_EXPR
4356               || code == MULT_EXPR
4357               || (code == TRUNC_DIV_EXPR && first_complex))
4358           && TREE_CODE (TREE_TYPE (result_type)) == REAL_TYPE
4359           && flag_signed_zeros)
4360         {
4361           /* An operation on mixed real/complex operands must be
4362              handled specially, but the language-independent code can
4363              more easily optimize the plain complex arithmetic if
4364              -fno-signed-zeros.  */
4365           tree real_type = TREE_TYPE (result_type);
4366           tree real, imag;
4367           if (first_complex)
4368             {
4369               if (TREE_TYPE (op0) != result_type)
4370                 op0 = cp_convert_and_check (result_type, op0);
4371               if (TREE_TYPE (op1) != real_type)
4372                 op1 = cp_convert_and_check (real_type, op1);
4373             }
4374           else
4375             {
4376               if (TREE_TYPE (op0) != real_type)
4377                 op0 = cp_convert_and_check (real_type, op0);
4378               if (TREE_TYPE (op1) != result_type)
4379                 op1 = cp_convert_and_check (result_type, op1);
4380             }
4381           if (TREE_CODE (op0) == ERROR_MARK || TREE_CODE (op1) == ERROR_MARK)
4382             return error_mark_node;
4383           if (first_complex)
4384             {
4385               op0 = save_expr (op0);
4386               real = cp_build_unary_op (REALPART_EXPR, op0, 1, complain);
4387               imag = cp_build_unary_op (IMAGPART_EXPR, op0, 1, complain);
4388               switch (code)
4389                 {
4390                 case MULT_EXPR:
4391                 case TRUNC_DIV_EXPR:
4392                   imag = build2 (resultcode, real_type, imag, op1);
4393                   /* Fall through.  */
4394                 case PLUS_EXPR:
4395                 case MINUS_EXPR:
4396                   real = build2 (resultcode, real_type, real, op1);
4397                   break;
4398                 default:
4399                   gcc_unreachable();
4400                 }
4401             }
4402           else
4403             {
4404               op1 = save_expr (op1);
4405               real = cp_build_unary_op (REALPART_EXPR, op1, 1, complain);
4406               imag = cp_build_unary_op (IMAGPART_EXPR, op1, 1, complain);
4407               switch (code)
4408                 {
4409                 case MULT_EXPR:
4410                   imag = build2 (resultcode, real_type, op0, imag);
4411                   /* Fall through.  */
4412                 case PLUS_EXPR:
4413                   real = build2 (resultcode, real_type, op0, real);
4414                   break;
4415                 case MINUS_EXPR:
4416                   real = build2 (resultcode, real_type, op0, real);
4417                   imag = build1 (NEGATE_EXPR, real_type, imag);
4418                   break;
4419                 default:
4420                   gcc_unreachable();
4421                 }
4422             }
4423           return build2 (COMPLEX_EXPR, result_type, real, imag);
4424         }
4425
4426       /* For certain operations (which identify themselves by shorten != 0)
4427          if both args were extended from the same smaller type,
4428          do the arithmetic in that type and then extend.
4429
4430          shorten !=0 and !=1 indicates a bitwise operation.
4431          For them, this optimization is safe only if
4432          both args are zero-extended or both are sign-extended.
4433          Otherwise, we might change the result.
4434          E.g., (short)-1 | (unsigned short)-1 is (int)-1
4435          but calculated in (unsigned short) it would be (unsigned short)-1.  */
4436
4437       if (shorten && none_complex)
4438         {
4439           final_type = result_type;
4440           result_type = shorten_binary_op (result_type, op0, op1, 
4441                                            shorten == -1);
4442         }
4443
4444       /* Comparison operations are shortened too but differently.
4445          They identify themselves by setting short_compare = 1.  */
4446
4447       if (short_compare)
4448         {
4449           /* Don't write &op0, etc., because that would prevent op0
4450              from being kept in a register.
4451              Instead, make copies of the our local variables and
4452              pass the copies by reference, then copy them back afterward.  */
4453           tree xop0 = op0, xop1 = op1, xresult_type = result_type;
4454           enum tree_code xresultcode = resultcode;
4455           tree val
4456             = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
4457           if (val != 0)
4458             return cp_convert (boolean_type_node, val);
4459           op0 = xop0, op1 = xop1;
4460           converted = 1;
4461           resultcode = xresultcode;
4462         }
4463
4464       if ((short_compare || code == MIN_EXPR || code == MAX_EXPR)
4465           && warn_sign_compare
4466           && !TREE_NO_WARNING (orig_op0)
4467           && !TREE_NO_WARNING (orig_op1)
4468           /* Do not warn until the template is instantiated; we cannot
4469              bound the ranges of the arguments until that point.  */
4470           && !processing_template_decl
4471           && (complain & tf_warning)
4472           && c_inhibit_evaluation_warnings == 0)
4473         {
4474           warn_for_sign_compare (location, orig_op0, orig_op1, op0, op1, 
4475                                  result_type, resultcode);
4476         }
4477     }
4478
4479   /* If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
4480      Then the expression will be built.
4481      It will be given type FINAL_TYPE if that is nonzero;
4482      otherwise, it will be given type RESULT_TYPE.  */
4483   if (! converted)
4484     {
4485       if (TREE_TYPE (op0) != result_type)
4486         op0 = cp_convert_and_check (result_type, op0);
4487       if (TREE_TYPE (op1) != result_type)
4488         op1 = cp_convert_and_check (result_type, op1);
4489
4490       if (op0 == error_mark_node || op1 == error_mark_node)
4491         return error_mark_node;
4492     }
4493
4494   if (build_type == NULL_TREE)
4495     build_type = result_type;
4496
4497   result = build2 (resultcode, build_type, op0, op1);
4498   result = fold_if_not_in_template (result);
4499   if (final_type != 0)
4500     result = cp_convert (final_type, result);
4501
4502   if (TREE_OVERFLOW_P (result) 
4503       && !TREE_OVERFLOW_P (op0) 
4504       && !TREE_OVERFLOW_P (op1))
4505     overflow_warning (location, result);
4506
4507   return result;
4508 }
4509 \f
4510 /* Return a tree for the sum or difference (RESULTCODE says which)
4511    of pointer PTROP and integer INTOP.  */
4512
4513 static tree
4514 cp_pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
4515 {
4516   tree res_type = TREE_TYPE (ptrop);
4517
4518   /* pointer_int_sum() uses size_in_bytes() on the TREE_TYPE(res_type)
4519      in certain circumstance (when it's valid to do so).  So we need
4520      to make sure it's complete.  We don't need to check here, if we
4521      can actually complete it at all, as those checks will be done in
4522      pointer_int_sum() anyway.  */
4523   complete_type (TREE_TYPE (res_type));
4524
4525   return pointer_int_sum (input_location, resultcode, ptrop,
4526                           fold_if_not_in_template (intop));
4527 }
4528
4529 /* Return a tree for the difference of pointers OP0 and OP1.
4530    The resulting tree has type int.  */
4531
4532 static tree
4533 pointer_diff (tree op0, tree op1, tree ptrtype)
4534 {
4535   tree result;
4536   tree restype = ptrdiff_type_node;
4537   tree target_type = TREE_TYPE (ptrtype);
4538
4539   if (!complete_type_or_else (target_type, NULL_TREE))
4540     return error_mark_node;
4541
4542   if (TREE_CODE (target_type) == VOID_TYPE)
4543     permerror (input_location, "ISO C++ forbids using pointer of type %<void *%> in subtraction");
4544   if (TREE_CODE (target_type) == FUNCTION_TYPE)
4545     permerror (input_location, "ISO C++ forbids using pointer to a function in subtraction");
4546   if (TREE_CODE (target_type) == METHOD_TYPE)
4547     permerror (input_location, "ISO C++ forbids using pointer to a method in subtraction");
4548
4549   /* First do the subtraction as integers;
4550      then drop through to build the divide operator.  */
4551
4552   op0 = cp_build_binary_op (input_location,
4553                             MINUS_EXPR,
4554                             cp_convert (restype, op0),
4555                             cp_convert (restype, op1),
4556                             tf_warning_or_error);
4557
4558   /* This generates an error if op1 is a pointer to an incomplete type.  */
4559   if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
4560     error ("invalid use of a pointer to an incomplete type in pointer arithmetic");
4561
4562   op1 = (TYPE_PTROB_P (ptrtype)
4563          ? size_in_bytes (target_type)
4564          : integer_one_node);
4565
4566   /* Do the division.  */
4567
4568   result = build2 (EXACT_DIV_EXPR, restype, op0, cp_convert (restype, op1));
4569   return fold_if_not_in_template (result);
4570 }
4571 \f
4572 /* Construct and perhaps optimize a tree representation
4573    for a unary operation.  CODE, a tree_code, specifies the operation
4574    and XARG is the operand.  */
4575
4576 tree
4577 build_x_unary_op (enum tree_code code, tree xarg, tsubst_flags_t complain)
4578 {
4579   tree orig_expr = xarg;
4580   tree exp;
4581   int ptrmem = 0;
4582
4583   if (processing_template_decl)
4584     {
4585       if (type_dependent_expression_p (xarg))
4586         return build_min_nt (code, xarg, NULL_TREE);
4587
4588       xarg = build_non_dependent_expr (xarg);
4589     }
4590
4591   exp = NULL_TREE;
4592
4593   /* [expr.unary.op] says:
4594
4595        The address of an object of incomplete type can be taken.
4596
4597      (And is just the ordinary address operator, not an overloaded
4598      "operator &".)  However, if the type is a template
4599      specialization, we must complete the type at this point so that
4600      an overloaded "operator &" will be available if required.  */
4601   if (code == ADDR_EXPR
4602       && TREE_CODE (xarg) != TEMPLATE_ID_EXPR
4603       && ((CLASS_TYPE_P (TREE_TYPE (xarg))
4604            && !COMPLETE_TYPE_P (complete_type (TREE_TYPE (xarg))))
4605           || (TREE_CODE (xarg) == OFFSET_REF)))
4606     /* Don't look for a function.  */;
4607   else
4608     exp = build_new_op (code, LOOKUP_NORMAL, xarg, NULL_TREE, NULL_TREE,
4609                         /*overloaded_p=*/NULL, complain);
4610   if (!exp && code == ADDR_EXPR)
4611     {
4612       if (is_overloaded_fn (xarg))
4613         {
4614           tree fn = get_first_fn (xarg);
4615           if (DECL_CONSTRUCTOR_P (fn) || DECL_DESTRUCTOR_P (fn))
4616             {
4617               error (DECL_CONSTRUCTOR_P (fn)
4618                      ? G_("taking address of constructor %qE")
4619                      : G_("taking address of destructor %qE"),
4620                      xarg);
4621               return error_mark_node;
4622             }
4623         }
4624
4625       /* A pointer to member-function can be formed only by saying
4626          &X::mf.  */
4627       if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE
4628           && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg)))
4629         {
4630           if (TREE_CODE (xarg) != OFFSET_REF
4631               || !TYPE_P (TREE_OPERAND (xarg, 0)))
4632             {
4633               error ("invalid use of %qE to form a pointer-to-member-function",
4634                      xarg);
4635               if (TREE_CODE (xarg) != OFFSET_REF)
4636                 inform (input_location, "  a qualified-id is required");
4637               return error_mark_node;
4638             }
4639           else
4640             {
4641               error ("parentheses around %qE cannot be used to form a"
4642                      " pointer-to-member-function",
4643                      xarg);
4644               PTRMEM_OK_P (xarg) = 1;
4645             }
4646         }
4647
4648       if (TREE_CODE (xarg) == OFFSET_REF)
4649         {
4650           ptrmem = PTRMEM_OK_P (xarg);
4651
4652           if (!ptrmem && !flag_ms_extensions
4653               && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
4654             {
4655               /* A single non-static member, make sure we don't allow a
4656                  pointer-to-member.  */
4657               xarg = build2 (OFFSET_REF, TREE_TYPE (xarg),
4658                              TREE_OPERAND (xarg, 0),
4659                              ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
4660               PTRMEM_OK_P (xarg) = ptrmem;
4661             }
4662         }
4663       else if (TREE_CODE (xarg) == TARGET_EXPR && (complain & tf_warning))
4664         warning (0, "taking address of temporary");
4665       exp = cp_build_unary_op (ADDR_EXPR, xarg, 0, complain);
4666     }
4667
4668   if (processing_template_decl && exp != error_mark_node)
4669     exp = build_min_non_dep (code, exp, orig_expr,
4670                              /*For {PRE,POST}{INC,DEC}REMENT_EXPR*/NULL_TREE);
4671   if (TREE_CODE (exp) == ADDR_EXPR)
4672     PTRMEM_OK_P (exp) = ptrmem;
4673   return exp;
4674 }
4675
4676 /* Like c_common_truthvalue_conversion, but handle pointer-to-member
4677    constants, where a null value is represented by an INTEGER_CST of
4678    -1.  */
4679
4680 tree
4681 cp_truthvalue_conversion (tree expr)
4682 {
4683   tree type = TREE_TYPE (expr);
4684   if (TYPE_PTRMEM_P (type))
4685     return build_binary_op (EXPR_LOCATION (expr),
4686                             NE_EXPR, expr, integer_zero_node, 1);
4687   else
4688     return c_common_truthvalue_conversion (input_location, expr);
4689 }
4690
4691 /* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR.  */
4692
4693 tree
4694 condition_conversion (tree expr)
4695 {
4696   tree t;
4697   if (processing_template_decl)
4698     return expr;
4699   t = perform_implicit_conversion_flags (boolean_type_node, expr,
4700                                          tf_warning_or_error, LOOKUP_NORMAL);
4701   t = fold_build_cleanup_point_expr (boolean_type_node, t);
4702   return t;
4703 }
4704
4705 /* Returns the address of T.  This function will fold away
4706    ADDR_EXPR of INDIRECT_REF.  */
4707
4708 tree
4709 build_address (tree t)
4710 {
4711   if (error_operand_p (t) || !cxx_mark_addressable (t))
4712     return error_mark_node;
4713   t = build_fold_addr_expr (t);
4714   if (TREE_CODE (t) != ADDR_EXPR)
4715     t = rvalue (t);
4716   return t;
4717 }
4718
4719 /* Returns the address of T with type TYPE.  */
4720
4721 tree
4722 build_typed_address (tree t, tree type)
4723 {
4724   if (error_operand_p (t) || !cxx_mark_addressable (t))
4725     return error_mark_node;
4726   t = build_fold_addr_expr_with_type (t, type);
4727   if (TREE_CODE (t) != ADDR_EXPR)
4728     t = rvalue (t);
4729   return t;
4730 }
4731
4732 /* Return a NOP_EXPR converting EXPR to TYPE.  */
4733
4734 tree
4735 build_nop (tree type, tree expr)
4736 {
4737   if (type == error_mark_node || error_operand_p (expr))
4738     return expr;
4739   return build1 (NOP_EXPR, type, expr);
4740 }
4741
4742 /* C++: Must handle pointers to members.
4743
4744    Perhaps type instantiation should be extended to handle conversion
4745    from aggregates to types we don't yet know we want?  (Or are those
4746    cases typically errors which should be reported?)
4747
4748    NOCONVERT nonzero suppresses the default promotions
4749    (such as from short to int).  */
4750
4751 tree
4752 cp_build_unary_op (enum tree_code code, tree xarg, int noconvert, 
4753                    tsubst_flags_t complain)
4754 {
4755   /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
4756   tree arg = xarg;
4757   tree argtype = 0;
4758   const char *errstring = NULL;
4759   tree val;
4760   const char *invalid_op_diag;
4761
4762   if (error_operand_p (arg))
4763     return error_mark_node;
4764
4765   if ((invalid_op_diag
4766        = targetm.invalid_unary_op ((code == UNARY_PLUS_EXPR
4767                                     ? CONVERT_EXPR
4768                                     : code),
4769                                    TREE_TYPE (xarg))))
4770     {
4771       error (invalid_op_diag);
4772       return error_mark_node;
4773     }
4774
4775   switch (code)
4776     {
4777     case UNARY_PLUS_EXPR:
4778     case NEGATE_EXPR:
4779       {
4780         int flags = WANT_ARITH | WANT_ENUM;
4781         /* Unary plus (but not unary minus) is allowed on pointers.  */
4782         if (code == UNARY_PLUS_EXPR)
4783           flags |= WANT_POINTER;
4784         arg = build_expr_type_conversion (flags, arg, true);
4785         if (!arg)
4786           errstring = (code == NEGATE_EXPR
4787                        ? _("wrong type argument to unary minus")
4788                        : _("wrong type argument to unary plus"));
4789         else
4790           {
4791             if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
4792               arg = perform_integral_promotions (arg);
4793
4794             /* Make sure the result is not an lvalue: a unary plus or minus
4795                expression is always a rvalue.  */
4796             arg = rvalue (arg);
4797           }
4798       }
4799       break;
4800
4801     case BIT_NOT_EXPR:
4802       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4803         {
4804           code = CONJ_EXPR;
4805           if (!noconvert)
4806             arg = default_conversion (arg);
4807         }
4808       else if (!(arg = build_expr_type_conversion (WANT_INT | WANT_ENUM
4809                                                    | WANT_VECTOR_OR_COMPLEX,
4810                                                    arg, true)))
4811         errstring = _("wrong type argument to bit-complement");
4812       else if (!noconvert && CP_INTEGRAL_TYPE_P (TREE_TYPE (arg)))
4813         arg = perform_integral_promotions (arg);
4814       break;
4815
4816     case ABS_EXPR:
4817       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4818         errstring = _("wrong type argument to abs");
4819       else if (!noconvert)
4820         arg = default_conversion (arg);
4821       break;
4822
4823     case CONJ_EXPR:
4824       /* Conjugating a real value is a no-op, but allow it anyway.  */
4825       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_ENUM, arg, true)))
4826         errstring = _("wrong type argument to conjugation");
4827       else if (!noconvert)
4828         arg = default_conversion (arg);
4829       break;
4830
4831     case TRUTH_NOT_EXPR:
4832       arg = perform_implicit_conversion (boolean_type_node, arg,
4833                                          complain);
4834       val = invert_truthvalue_loc (input_location, arg);
4835       if (arg != error_mark_node)
4836         return val;
4837       errstring = _("in argument to unary !");
4838       break;
4839
4840     case NOP_EXPR:
4841       break;
4842
4843     case REALPART_EXPR:
4844       if (TREE_CODE (arg) == COMPLEX_CST)
4845         return TREE_REALPART (arg);
4846       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4847         {
4848           arg = build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4849           return fold_if_not_in_template (arg);
4850         }
4851       else
4852         return arg;
4853
4854     case IMAGPART_EXPR:
4855       if (TREE_CODE (arg) == COMPLEX_CST)
4856         return TREE_IMAGPART (arg);
4857       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4858         {
4859           arg = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
4860           return fold_if_not_in_template (arg);
4861         }
4862       else
4863         return cp_convert (TREE_TYPE (arg), integer_zero_node);
4864
4865     case PREINCREMENT_EXPR:
4866     case POSTINCREMENT_EXPR:
4867     case PREDECREMENT_EXPR:
4868     case POSTDECREMENT_EXPR:
4869       /* Handle complex lvalues (when permitted)
4870          by reduction to simpler cases.  */
4871
4872       val = unary_complex_lvalue (code, arg);
4873       if (val != 0)
4874         return val;
4875
4876       arg = mark_lvalue_use (arg);
4877
4878       /* Increment or decrement the real part of the value,
4879          and don't change the imaginary part.  */
4880       if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
4881         {
4882           tree real, imag;
4883
4884           arg = stabilize_reference (arg);
4885           real = cp_build_unary_op (REALPART_EXPR, arg, 1, complain);
4886           imag = cp_build_unary_op (IMAGPART_EXPR, arg, 1, complain);
4887           real = cp_build_unary_op (code, real, 1, complain);
4888           if (real == error_mark_node || imag == error_mark_node)
4889             return error_mark_node;
4890           return build2 (COMPLEX_EXPR, TREE_TYPE (arg),
4891                          real, imag);
4892         }
4893
4894       /* Report invalid types.  */
4895
4896       if (!(arg = build_expr_type_conversion (WANT_ARITH | WANT_POINTER,
4897                                               arg, true)))
4898         {
4899           if (code == PREINCREMENT_EXPR)
4900             errstring = _("no pre-increment operator for type");
4901           else if (code == POSTINCREMENT_EXPR)
4902             errstring = _("no post-increment operator for type");
4903           else if (code == PREDECREMENT_EXPR)
4904             errstring = _("no pre-decrement operator for type");
4905           else
4906             errstring = _("no post-decrement operator for type");
4907           break;
4908         }
4909       else if (arg == error_mark_node)
4910         return error_mark_node;
4911
4912       /* Report something read-only.  */
4913
4914       if (CP_TYPE_CONST_P (TREE_TYPE (arg))
4915           || TREE_READONLY (arg)) 
4916         {
4917           if (complain & tf_error)
4918             readonly_error (arg, ((code == PREINCREMENT_EXPR
4919                                    || code == POSTINCREMENT_EXPR)
4920                                   ? REK_INCREMENT : REK_DECREMENT));
4921           else
4922             return error_mark_node;
4923         }
4924
4925       {
4926         tree inc;
4927         tree declared_type = unlowered_expr_type (arg);
4928
4929         argtype = TREE_TYPE (arg);
4930
4931         /* ARM $5.2.5 last annotation says this should be forbidden.  */
4932         if (TREE_CODE (argtype) == ENUMERAL_TYPE)
4933           {
4934             if (complain & tf_error)
4935               permerror (input_location, (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
4936                          ? G_("ISO C++ forbids incrementing an enum")
4937                          : G_("ISO C++ forbids decrementing an enum"));
4938             else
4939               return error_mark_node;
4940           }
4941
4942         /* Compute the increment.  */
4943
4944         if (TREE_CODE (argtype) == POINTER_TYPE)
4945           {
4946             tree type = complete_type (TREE_TYPE (argtype));
4947
4948             if (!COMPLETE_OR_VOID_TYPE_P (type))
4949               {
4950                 if (complain & tf_error)
4951                   error (((code == PREINCREMENT_EXPR
4952                            || code == POSTINCREMENT_EXPR))
4953                          ? G_("cannot increment a pointer to incomplete type %qT")
4954                          : G_("cannot decrement a pointer to incomplete type %qT"),
4955                          TREE_TYPE (argtype));
4956                 else
4957                   return error_mark_node;
4958               }
4959             else if ((pedantic || warn_pointer_arith)
4960                      && !TYPE_PTROB_P (argtype)) 
4961               {
4962                 if (complain & tf_error)
4963                   permerror (input_location, (code == PREINCREMENT_EXPR
4964                               || code == POSTINCREMENT_EXPR)
4965                              ? G_("ISO C++ forbids incrementing a pointer of type %qT")
4966                              : G_("ISO C++ forbids decrementing a pointer of type %qT"),
4967                              argtype);
4968                 else
4969                   return error_mark_node;
4970               }
4971
4972             inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
4973           }
4974         else
4975           inc = integer_one_node;
4976
4977         inc = cp_convert (argtype, inc);
4978
4979         /* Complain about anything else that is not a true lvalue.  */
4980         if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
4981                                     || code == POSTINCREMENT_EXPR)
4982                                    ? lv_increment : lv_decrement),
4983                              complain))
4984           return error_mark_node;
4985
4986         /* Forbid using -- on `bool'.  */
4987         if (TREE_CODE (declared_type) == BOOLEAN_TYPE)
4988           {
4989             if (code == POSTDECREMENT_EXPR || code == PREDECREMENT_EXPR)
4990               {
4991                 if (complain & tf_error)
4992                   error ("invalid use of Boolean expression as operand "
4993                          "to %<operator--%>");
4994                 return error_mark_node;
4995               }
4996             val = boolean_increment (code, arg);
4997           }
4998         else
4999           val = build2 (code, TREE_TYPE (arg), arg, inc);
5000
5001         TREE_SIDE_EFFECTS (val) = 1;
5002         return val;
5003       }
5004
5005     case ADDR_EXPR:
5006       /* Note that this operation never does default_conversion
5007          regardless of NOCONVERT.  */
5008
5009       argtype = lvalue_type (arg);
5010
5011       arg = mark_lvalue_use (arg);
5012
5013       if (TREE_CODE (arg) == OFFSET_REF)
5014         goto offset_ref;
5015
5016       if (TREE_CODE (argtype) == REFERENCE_TYPE)
5017         {
5018           tree type = build_pointer_type (TREE_TYPE (argtype));
5019           arg = build1 (CONVERT_EXPR, type, arg);
5020           return arg;
5021         }
5022       else if (pedantic && DECL_MAIN_P (arg))
5023         {
5024           /* ARM $3.4 */
5025           /* Apparently a lot of autoconf scripts for C++ packages do this,
5026              so only complain if -pedantic.  */
5027           if (complain & (flag_pedantic_errors ? tf_error : tf_warning))
5028             pedwarn (input_location, OPT_pedantic,
5029                      "ISO C++ forbids taking address of function %<::main%>");
5030           else if (flag_pedantic_errors)
5031             return error_mark_node;
5032         }
5033
5034       /* Let &* cancel out to simplify resulting code.  */
5035       if (TREE_CODE (arg) == INDIRECT_REF)
5036         {
5037           /* We don't need to have `current_class_ptr' wrapped in a
5038              NON_LVALUE_EXPR node.  */
5039           if (arg == current_class_ref)
5040             return current_class_ptr;
5041
5042           arg = TREE_OPERAND (arg, 0);
5043           if (TREE_CODE (TREE_TYPE (arg)) == REFERENCE_TYPE)
5044             {
5045               tree type = build_pointer_type (TREE_TYPE (TREE_TYPE (arg)));
5046               arg = build1 (CONVERT_EXPR, type, arg);
5047             }
5048           else
5049             /* Don't let this be an lvalue.  */
5050             arg = rvalue (arg);
5051           return arg;
5052         }
5053
5054       /* ??? Cope with user tricks that amount to offsetof.  */
5055       if (TREE_CODE (argtype) != FUNCTION_TYPE
5056           && TREE_CODE (argtype) != METHOD_TYPE
5057           && argtype != unknown_type_node
5058           && (val = get_base_address (arg))
5059           && TREE_CODE (val) == INDIRECT_REF
5060           && TREE_CONSTANT (TREE_OPERAND (val, 0)))
5061         {
5062           tree type = build_pointer_type (argtype);
5063           tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
5064           tree op1 = fold_convert (sizetype, fold_offsetof (arg, val));
5065           return fold_build2 (POINTER_PLUS_EXPR, type, op0, op1);
5066         }
5067
5068       /* Uninstantiated types are all functions.  Taking the
5069          address of a function is a no-op, so just return the
5070          argument.  */
5071
5072       gcc_assert (TREE_CODE (arg) != IDENTIFIER_NODE
5073                   || !IDENTIFIER_OPNAME_P (arg));
5074
5075       if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
5076           && !really_overloaded_fn (TREE_OPERAND (arg, 1)))
5077         {
5078           /* They're trying to take the address of a unique non-static
5079              member function.  This is ill-formed (except in MS-land),
5080              but let's try to DTRT.
5081              Note: We only handle unique functions here because we don't
5082              want to complain if there's a static overload; non-unique
5083              cases will be handled by instantiate_type.  But we need to
5084              handle this case here to allow casts on the resulting PMF.
5085              We could defer this in non-MS mode, but it's easier to give
5086              a useful error here.  */
5087
5088           /* Inside constant member functions, the `this' pointer
5089              contains an extra const qualifier.  TYPE_MAIN_VARIANT
5090              is used here to remove this const from the diagnostics
5091              and the created OFFSET_REF.  */
5092           tree base = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (arg, 0)));
5093           tree fn = get_first_fn (TREE_OPERAND (arg, 1));
5094           mark_used (fn);
5095
5096           if (! flag_ms_extensions)
5097             {
5098               tree name = DECL_NAME (fn);
5099               if (!(complain & tf_error))
5100                 return error_mark_node;
5101               else if (current_class_type
5102                        && TREE_OPERAND (arg, 0) == current_class_ref)
5103                   /* An expression like &memfn.  */
5104                 permerror (input_location, "ISO C++ forbids taking the address of an unqualified"
5105                            " or parenthesized non-static member function to form"
5106                            " a pointer to member function.  Say %<&%T::%D%>",
5107                            base, name);
5108               else
5109                 permerror (input_location, "ISO C++ forbids taking the address of a bound member"
5110                            " function to form a pointer to member function."
5111                            "  Say %<&%T::%D%>",
5112                            base, name);
5113             }
5114           arg = build_offset_ref (base, fn, /*address_p=*/true);
5115         }
5116
5117     offset_ref:
5118       if (type_unknown_p (arg))
5119         return build1 (ADDR_EXPR, unknown_type_node, arg);
5120
5121       /* Handle complex lvalues (when permitted)
5122          by reduction to simpler cases.  */
5123       val = unary_complex_lvalue (code, arg);
5124       if (val != 0)
5125         return val;
5126
5127       switch (TREE_CODE (arg))
5128         {
5129         CASE_CONVERT:
5130         case FLOAT_EXPR:
5131         case FIX_TRUNC_EXPR:
5132           /* Even if we're not being pedantic, we cannot allow this
5133              extension when we're instantiating in a SFINAE
5134              context.  */
5135           if (! lvalue_p (arg) && complain == tf_none)
5136             {
5137               if (complain & tf_error)
5138                 permerror (input_location, "ISO C++ forbids taking the address of a cast to a non-lvalue expression");
5139               else
5140                 return error_mark_node;
5141             }
5142           break;
5143
5144         case BASELINK:
5145           arg = BASELINK_FUNCTIONS (arg);
5146           /* Fall through.  */
5147
5148         case OVERLOAD:
5149           arg = OVL_CURRENT (arg);
5150           break;
5151
5152         case OFFSET_REF:
5153           /* Turn a reference to a non-static data member into a
5154              pointer-to-member.  */
5155           {
5156             tree type;
5157             tree t;
5158
5159             if (!PTRMEM_OK_P (arg))
5160               return cp_build_unary_op (code, arg, 0, complain);
5161
5162             t = TREE_OPERAND (arg, 1);
5163             if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
5164               {
5165                 if (complain & tf_error)
5166                   error ("cannot create pointer to reference member %qD", t);
5167                 return error_mark_node;
5168               }
5169
5170             type = build_ptrmem_type (context_for_name_lookup (t),
5171                                       TREE_TYPE (t));
5172             t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
5173             return t;
5174           }
5175
5176         default:
5177           break;
5178         }
5179
5180       /* Anything not already handled and not a true memory reference
5181          is an error.  */
5182       if (TREE_CODE (argtype) != FUNCTION_TYPE
5183           && TREE_CODE (argtype) != METHOD_TYPE
5184           && TREE_CODE (arg) != OFFSET_REF
5185           && !lvalue_or_else (arg, lv_addressof, complain))
5186         return error_mark_node;
5187
5188       if (argtype != error_mark_node)
5189         argtype = build_pointer_type (argtype);
5190
5191       /* In a template, we are processing a non-dependent expression
5192          so we can just form an ADDR_EXPR with the correct type.  */
5193       if (processing_template_decl || TREE_CODE (arg) != COMPONENT_REF)
5194         {
5195           val = build_address (arg);
5196           if (TREE_CODE (arg) == OFFSET_REF)
5197             PTRMEM_OK_P (val) = PTRMEM_OK_P (arg);
5198         }
5199       else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK)
5200         {
5201           tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (arg, 1));
5202
5203           /* We can only get here with a single static member
5204              function.  */
5205           gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
5206                       && DECL_STATIC_FUNCTION_P (fn));
5207           mark_used (fn);
5208           val = build_address (fn);
5209           if (TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
5210             /* Do not lose object's side effects.  */
5211             val = build2 (COMPOUND_EXPR, TREE_TYPE (val),
5212                           TREE_OPERAND (arg, 0), val);
5213         }
5214       else if (DECL_C_BIT_FIELD (TREE_OPERAND (arg, 1)))
5215         {
5216           if (complain & tf_error)
5217             error ("attempt to take address of bit-field structure member %qD",
5218                    TREE_OPERAND (arg, 1));
5219           return error_mark_node;
5220         }
5221       else
5222         {
5223           tree object = TREE_OPERAND (arg, 0);
5224           tree field = TREE_OPERAND (arg, 1);
5225           gcc_assert (same_type_ignoring_top_level_qualifiers_p
5226                       (TREE_TYPE (object), decl_type_context (field)));
5227           val = build_address (arg);
5228         }
5229
5230       if (TREE_CODE (argtype) == POINTER_TYPE
5231           && TREE_CODE (TREE_TYPE (argtype)) == METHOD_TYPE)
5232         {
5233           build_ptrmemfunc_type (argtype);
5234           val = build_ptrmemfunc (argtype, val, 0,
5235                                   /*c_cast_p=*/false);
5236         }
5237
5238       return val;
5239
5240     default:
5241       break;
5242     }
5243
5244   if (!errstring)
5245     {
5246       if (argtype == 0)
5247         argtype = TREE_TYPE (arg);
5248       return fold_if_not_in_template (build1 (code, argtype, arg));
5249     }
5250
5251   if (complain & tf_error)
5252     error ("%s", errstring);
5253   return error_mark_node;
5254 }
5255
5256 /* Hook for the c-common bits that build a unary op.  */
5257 tree
5258 build_unary_op (location_t location ATTRIBUTE_UNUSED,
5259                 enum tree_code code, tree xarg, int noconvert)
5260 {
5261   return cp_build_unary_op (code, xarg, noconvert, tf_warning_or_error);
5262 }
5263
5264 /* Apply unary lvalue-demanding operator CODE to the expression ARG
5265    for certain kinds of expressions which are not really lvalues
5266    but which we can accept as lvalues.
5267
5268    If ARG is not a kind of expression we can handle, return
5269    NULL_TREE.  */
5270
5271 tree
5272 unary_complex_lvalue (enum tree_code code, tree arg)
5273 {
5274   /* Inside a template, making these kinds of adjustments is
5275      pointless; we are only concerned with the type of the
5276      expression.  */
5277   if (processing_template_decl)
5278     return NULL_TREE;
5279
5280   /* Handle (a, b) used as an "lvalue".  */
5281   if (TREE_CODE (arg) == COMPOUND_EXPR)
5282     {
5283       tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 1), 0,
5284                                             tf_warning_or_error);
5285       return build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
5286                      TREE_OPERAND (arg, 0), real_result);
5287     }
5288
5289   /* Handle (a ? b : c) used as an "lvalue".  */
5290   if (TREE_CODE (arg) == COND_EXPR
5291       || TREE_CODE (arg) == MIN_EXPR || TREE_CODE (arg) == MAX_EXPR)
5292     return rationalize_conditional_expr (code, arg, tf_warning_or_error);
5293
5294   /* Handle (a = b), (++a), and (--a) used as an "lvalue".  */
5295   if (TREE_CODE (arg) == MODIFY_EXPR
5296       || TREE_CODE (arg) == PREINCREMENT_EXPR
5297       || TREE_CODE (arg) == PREDECREMENT_EXPR)
5298     {
5299       tree lvalue = TREE_OPERAND (arg, 0);
5300       if (TREE_SIDE_EFFECTS (lvalue))
5301         {
5302           lvalue = stabilize_reference (lvalue);
5303           arg = build2 (TREE_CODE (arg), TREE_TYPE (arg),
5304                         lvalue, TREE_OPERAND (arg, 1));
5305         }
5306       return unary_complex_lvalue
5307         (code, build2 (COMPOUND_EXPR, TREE_TYPE (lvalue), arg, lvalue));
5308     }
5309
5310   if (code != ADDR_EXPR)
5311     return NULL_TREE;
5312
5313   /* Handle (a = b) used as an "lvalue" for `&'.  */
5314   if (TREE_CODE (arg) == MODIFY_EXPR
5315       || TREE_CODE (arg) == INIT_EXPR)
5316     {
5317       tree real_result = cp_build_unary_op (code, TREE_OPERAND (arg, 0), 0,
5318                                             tf_warning_or_error);
5319       arg = build2 (COMPOUND_EXPR, TREE_TYPE (real_result),
5320                     arg, real_result);
5321       TREE_NO_WARNING (arg) = 1;
5322       return arg;
5323     }
5324
5325   if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
5326       || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
5327       || TREE_CODE (arg) == OFFSET_REF)
5328     return NULL_TREE;
5329
5330   /* We permit compiler to make function calls returning
5331      objects of aggregate type look like lvalues.  */
5332   {
5333     tree targ = arg;
5334
5335     if (TREE_CODE (targ) == SAVE_EXPR)
5336       targ = TREE_OPERAND (targ, 0);
5337
5338     if (TREE_CODE (targ) == CALL_EXPR && MAYBE_CLASS_TYPE_P (TREE_TYPE (targ)))
5339       {
5340         if (TREE_CODE (arg) == SAVE_EXPR)
5341           targ = arg;
5342         else
5343           targ = build_cplus_new (TREE_TYPE (arg), arg);
5344         return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (arg)), targ);
5345       }
5346
5347     if (TREE_CODE (arg) == SAVE_EXPR && TREE_CODE (targ) == INDIRECT_REF)
5348       return build3 (SAVE_EXPR, build_pointer_type (TREE_TYPE (arg)),
5349                      TREE_OPERAND (targ, 0), current_function_decl, NULL);
5350   }
5351
5352   /* Don't let anything else be handled specially.  */
5353   return NULL_TREE;
5354 }
5355 \f
5356 /* Mark EXP saying that we need to be able to take the
5357    address of it; it should not be allocated in a register.
5358    Value is true if successful.
5359
5360    C++: we do not allow `current_class_ptr' to be addressable.  */
5361
5362 bool
5363 cxx_mark_addressable (tree exp)
5364 {
5365   tree x = exp;
5366
5367   while (1)
5368     switch (TREE_CODE (x))
5369       {
5370       case ADDR_EXPR:
5371       case COMPONENT_REF:
5372       case ARRAY_REF:
5373       case REALPART_EXPR:
5374       case IMAGPART_EXPR:
5375         x = TREE_OPERAND (x, 0);
5376         break;
5377
5378       case PARM_DECL:
5379         if (x == current_class_ptr)
5380           {
5381             error ("cannot take the address of %<this%>, which is an rvalue expression");
5382             TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later.  */
5383             return true;
5384           }
5385         /* Fall through.  */
5386
5387       case VAR_DECL:
5388         /* Caller should not be trying to mark initialized
5389            constant fields addressable.  */
5390         gcc_assert (DECL_LANG_SPECIFIC (x) == 0
5391                     || DECL_IN_AGGR_P (x) == 0
5392                     || TREE_STATIC (x)
5393                     || DECL_EXTERNAL (x));
5394         /* Fall through.  */
5395
5396       case CONST_DECL:
5397       case RESULT_DECL:
5398         if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
5399             && !DECL_ARTIFICIAL (x))
5400           {
5401             if (TREE_CODE (x) == VAR_DECL && DECL_HARD_REGISTER (x))
5402               {
5403                 error
5404                   ("address of explicit register variable %qD requested", x);
5405                 return false;
5406               }
5407             else if (extra_warnings)
5408               warning
5409                 (OPT_Wextra, "address requested for %qD, which is declared %<register%>", x);
5410           }
5411         TREE_ADDRESSABLE (x) = 1;
5412         return true;
5413
5414       case FUNCTION_DECL:
5415         TREE_ADDRESSABLE (x) = 1;
5416         return true;
5417
5418       case CONSTRUCTOR:
5419         TREE_ADDRESSABLE (x) = 1;
5420         return true;
5421
5422       case TARGET_EXPR:
5423         TREE_ADDRESSABLE (x) = 1;
5424         cxx_mark_addressable (TREE_OPERAND (x, 0));
5425         return true;
5426
5427       default:
5428         return true;
5429     }
5430 }
5431 \f
5432 /* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
5433
5434 tree
5435 build_x_conditional_expr (tree ifexp, tree op1, tree op2, 
5436                           tsubst_flags_t complain)
5437 {
5438   tree orig_ifexp = ifexp;
5439   tree orig_op1 = op1;
5440   tree orig_op2 = op2;
5441   tree expr;
5442
5443   if (processing_template_decl)
5444     {
5445       /* The standard says that the expression is type-dependent if
5446          IFEXP is type-dependent, even though the eventual type of the
5447          expression doesn't dependent on IFEXP.  */
5448       if (type_dependent_expression_p (ifexp)
5449           /* As a GNU extension, the middle operand may be omitted.  */
5450           || (op1 && type_dependent_expression_p (op1))
5451           || type_dependent_expression_p (op2))
5452         return build_min_nt (COND_EXPR, ifexp, op1, op2);
5453       ifexp = build_non_dependent_expr (ifexp);
5454       if (op1)
5455         op1 = build_non_dependent_expr (op1);
5456       op2 = build_non_dependent_expr (op2);
5457     }
5458
5459   expr = build_conditional_expr (ifexp, op1, op2, complain);
5460   if (processing_template_decl && expr != error_mark_node)
5461     return build_min_non_dep (COND_EXPR, expr,
5462                               orig_ifexp, orig_op1, orig_op2);
5463   return expr;
5464 }
5465 \f
5466 /* Given a list of expressions, return a compound expression
5467    that performs them all and returns the value of the last of them.  */
5468
5469 tree build_x_compound_expr_from_list (tree list, const char *msg)
5470 {
5471   tree expr = TREE_VALUE (list);
5472
5473   if (TREE_CHAIN (list))
5474     {
5475       if (msg)
5476         permerror (input_location, "%s expression list treated as compound expression", msg);
5477
5478       for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
5479         expr = build_x_compound_expr (expr, TREE_VALUE (list), 
5480                                       tf_warning_or_error);
5481     }
5482
5483   return expr;
5484 }
5485
5486 /* Like build_x_compound_expr_from_list, but using a VEC.  */
5487
5488 tree
5489 build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
5490 {
5491   if (VEC_empty (tree, vec))
5492     return NULL_TREE;
5493   else if (VEC_length (tree, vec) == 1)
5494     return VEC_index (tree, vec, 0);
5495   else
5496     {
5497       tree expr;
5498       unsigned int ix;
5499       tree t;
5500
5501       if (msg != NULL)
5502         permerror (input_location,
5503                    "%s expression list treated as compound expression",
5504                    msg);
5505
5506       expr = VEC_index (tree, vec, 0);
5507       for (ix = 1; VEC_iterate (tree, vec, ix, t); ++ix)
5508         expr = build_x_compound_expr (expr, t, tf_warning_or_error);
5509
5510       return expr;
5511     }
5512 }
5513
5514 /* Handle overloading of the ',' operator when needed.  */
5515
5516 tree
5517 build_x_compound_expr (tree op1, tree op2, tsubst_flags_t complain)
5518 {
5519   tree result;
5520   tree orig_op1 = op1;
5521   tree orig_op2 = op2;
5522
5523   if (processing_template_decl)
5524     {
5525       if (type_dependent_expression_p (op1)
5526           || type_dependent_expression_p (op2))
5527         return build_min_nt (COMPOUND_EXPR, op1, op2);
5528       op1 = build_non_dependent_expr (op1);
5529       op2 = build_non_dependent_expr (op2);
5530     }
5531
5532   result = build_new_op (COMPOUND_EXPR, LOOKUP_NORMAL, op1, op2, NULL_TREE,
5533                          /*overloaded_p=*/NULL, complain);
5534   if (!result)
5535     result = cp_build_compound_expr (op1, op2, complain);
5536
5537   if (processing_template_decl && result != error_mark_node)
5538     return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
5539
5540   return result;
5541 }
5542
5543 /* Like cp_build_compound_expr, but for the c-common bits.  */
5544
5545 tree
5546 build_compound_expr (location_t loc ATTRIBUTE_UNUSED, tree lhs, tree rhs)
5547 {
5548   return cp_build_compound_expr (lhs, rhs, tf_warning_or_error);
5549 }
5550
5551 /* Build a compound expression.  */
5552
5553 tree
5554 cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
5555 {
5556   lhs = convert_to_void (lhs, "left-hand operand of comma", complain);
5557
5558   if (lhs == error_mark_node || rhs == error_mark_node)
5559     return error_mark_node;
5560
5561   if (TREE_CODE (rhs) == TARGET_EXPR)
5562     {
5563       /* If the rhs is a TARGET_EXPR, then build the compound
5564          expression inside the target_expr's initializer. This
5565          helps the compiler to eliminate unnecessary temporaries.  */
5566       tree init = TREE_OPERAND (rhs, 1);
5567
5568       init = build2 (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
5569       TREE_OPERAND (rhs, 1) = init;
5570
5571       return rhs;
5572     }
5573
5574   if (type_unknown_p (rhs))
5575     {
5576       error ("no context to resolve type of %qE", rhs);
5577       return error_mark_node;
5578     }
5579   
5580   return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
5581 }
5582
5583 /* Issue a diagnostic message if casting from SRC_TYPE to DEST_TYPE
5584    casts away constness.  CAST gives the type of cast.  
5585
5586    ??? This function warns for casting away any qualifier not just
5587    const.  We would like to specify exactly what qualifiers are casted
5588    away.
5589 */
5590
5591 static void
5592 check_for_casting_away_constness (tree src_type, tree dest_type,
5593                                   enum tree_code cast)
5594 {
5595   /* C-style casts are allowed to cast away constness.  With
5596      WARN_CAST_QUAL, we still want to issue a warning.  */
5597   if (cast == CAST_EXPR && !warn_cast_qual)
5598       return;
5599   
5600   if (!casts_away_constness (src_type, dest_type))
5601     return;
5602
5603   switch (cast)
5604     {
5605     case CAST_EXPR:
5606       warning (OPT_Wcast_qual, 
5607                "cast from type %qT to type %qT casts away qualifiers",
5608                src_type, dest_type);
5609       return;
5610       
5611     case STATIC_CAST_EXPR:
5612       error ("static_cast from type %qT to type %qT casts away qualifiers",
5613              src_type, dest_type);
5614       return;
5615       
5616     case REINTERPRET_CAST_EXPR:
5617       error ("reinterpret_cast from type %qT to type %qT casts away qualifiers",
5618              src_type, dest_type);
5619       return;
5620     default:
5621       gcc_unreachable();
5622     }
5623 }
5624
5625 /* Convert EXPR (an expression with pointer-to-member type) to TYPE
5626    (another pointer-to-member type in the same hierarchy) and return
5627    the converted expression.  If ALLOW_INVERSE_P is permitted, a
5628    pointer-to-derived may be converted to pointer-to-base; otherwise,
5629    only the other direction is permitted.  If C_CAST_P is true, this
5630    conversion is taking place as part of a C-style cast.  */
5631
5632 tree
5633 convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
5634                 bool c_cast_p)
5635 {
5636   if (TYPE_PTRMEM_P (type))
5637     {
5638       tree delta;
5639
5640       if (TREE_CODE (expr) == PTRMEM_CST)
5641         expr = cplus_expand_constant (expr);
5642       delta = get_delta_difference (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)),
5643                                     TYPE_PTRMEM_CLASS_TYPE (type),
5644                                     allow_inverse_p,
5645                                     c_cast_p);
5646       if (!integer_zerop (delta))
5647         {
5648           tree cond, op1, op2;
5649
5650           cond = cp_build_binary_op (input_location,
5651                                      EQ_EXPR,
5652                                      expr,
5653                                      build_int_cst (TREE_TYPE (expr), -1),
5654                                      tf_warning_or_error);
5655           op1 = build_nop (ptrdiff_type_node, expr);
5656           op2 = cp_build_binary_op (input_location,
5657                                     PLUS_EXPR, op1, delta,
5658                                     tf_warning_or_error);
5659
5660           expr = fold_build3_loc (input_location,
5661                               COND_EXPR, ptrdiff_type_node, cond, op1, op2);
5662                          
5663         }
5664
5665       return build_nop (type, expr);
5666     }
5667   else
5668     return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
5669                              allow_inverse_p, c_cast_p);
5670 }
5671
5672 /* If EXPR is an INTEGER_CST and ORIG is an arithmetic constant, return
5673    a version of EXPR that has TREE_OVERFLOW set if it is set in ORIG.
5674    Otherwise, return EXPR unchanged.  */
5675
5676 static tree
5677 ignore_overflows (tree expr, tree orig)
5678 {
5679   if (TREE_CODE (expr) == INTEGER_CST
5680       && CONSTANT_CLASS_P (orig)
5681       && TREE_CODE (orig) != STRING_CST
5682       && TREE_OVERFLOW (expr) != TREE_OVERFLOW (orig))
5683     {
5684       if (!TREE_OVERFLOW (orig))
5685         /* Ensure constant sharing.  */
5686         expr = build_int_cst_wide (TREE_TYPE (expr),
5687                                    TREE_INT_CST_LOW (expr),
5688                                    TREE_INT_CST_HIGH (expr));
5689       else
5690         {
5691           /* Avoid clobbering a shared constant.  */
5692           expr = copy_node (expr);
5693           TREE_OVERFLOW (expr) = TREE_OVERFLOW (orig);
5694         }
5695     }
5696   return expr;
5697 }
5698
5699 /* Perform a static_cast from EXPR to TYPE.  When C_CAST_P is true,
5700    this static_cast is being attempted as one of the possible casts
5701    allowed by a C-style cast.  (In that case, accessibility of base
5702    classes is not considered, and it is OK to cast away
5703    constness.)  Return the result of the cast.  *VALID_P is set to
5704    indicate whether or not the cast was valid.  */
5705
5706 static tree
5707 build_static_cast_1 (tree type, tree expr, bool c_cast_p,
5708                      bool *valid_p, tsubst_flags_t complain)
5709 {
5710   tree intype;
5711   tree result;
5712   tree orig;
5713
5714   /* Assume the cast is valid.  */
5715   *valid_p = true;
5716
5717   intype = TREE_TYPE (expr);
5718
5719   /* Save casted types in the function's used types hash table.  */
5720   used_types_insert (type);
5721
5722   /* [expr.static.cast]
5723
5724      An lvalue of type "cv1 B", where B is a class type, can be cast
5725      to type "reference to cv2 D", where D is a class derived (clause
5726      _class.derived_) from B, if a valid standard conversion from
5727      "pointer to D" to "pointer to B" exists (_conv.ptr_), cv2 is the
5728      same cv-qualification as, or greater cv-qualification than, cv1,
5729      and B is not a virtual base class of D.  */
5730   /* We check this case before checking the validity of "TYPE t =
5731      EXPR;" below because for this case:
5732
5733        struct B {};
5734        struct D : public B { D(const B&); };
5735        extern B& b;
5736        void f() { static_cast<const D&>(b); }
5737
5738      we want to avoid constructing a new D.  The standard is not
5739      completely clear about this issue, but our interpretation is
5740      consistent with other compilers.  */
5741   if (TREE_CODE (type) == REFERENCE_TYPE
5742       && CLASS_TYPE_P (TREE_TYPE (type))
5743       && CLASS_TYPE_P (intype)
5744       && (TYPE_REF_IS_RVALUE (type) || real_lvalue_p (expr))
5745       && DERIVED_FROM_P (intype, TREE_TYPE (type))
5746       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
5747                       build_pointer_type (TYPE_MAIN_VARIANT
5748                                           (TREE_TYPE (type))))
5749       && (c_cast_p
5750           || at_least_as_qualified_p (TREE_TYPE (type), intype)))
5751     {
5752       tree base;
5753
5754       /* There is a standard conversion from "D*" to "B*" even if "B"
5755          is ambiguous or inaccessible.  If this is really a
5756          static_cast, then we check both for inaccessibility and
5757          ambiguity.  However, if this is a static_cast being performed
5758          because the user wrote a C-style cast, then accessibility is
5759          not considered.  */
5760       base = lookup_base (TREE_TYPE (type), intype,
5761                           c_cast_p ? ba_unique : ba_check,
5762                           NULL);
5763
5764       /* Convert from "B*" to "D*".  This function will check that "B"
5765          is not a virtual base of "D".  */
5766       expr = build_base_path (MINUS_EXPR, build_address (expr),
5767                               base, /*nonnull=*/false);
5768       /* Convert the pointer to a reference -- but then remember that
5769          there are no expressions with reference type in C++.  */
5770       return convert_from_reference (cp_fold_convert (type, expr));
5771     }
5772
5773   /* "An lvalue of type cv1 T1 can be cast to type rvalue reference to
5774      cv2 T2 if cv2 T2 is reference-compatible with cv1 T1 (8.5.3)."  */
5775   if (TREE_CODE (type) == REFERENCE_TYPE
5776       && TYPE_REF_IS_RVALUE (type)
5777       && real_lvalue_p (expr)
5778       && reference_related_p (TREE_TYPE (type), intype)
5779       && (c_cast_p || at_least_as_qualified_p (TREE_TYPE (type), intype)))
5780     {
5781       expr = build_typed_address (expr, type);
5782       return convert_from_reference (expr);
5783     }
5784
5785   orig = expr;
5786
5787   /* Resolve overloaded address here rather than once in
5788      implicit_conversion and again in the inverse code below.  */
5789   if (TYPE_PTRMEMFUNC_P (type) && type_unknown_p (expr))
5790     {
5791       expr = instantiate_type (type, expr, complain);
5792       intype = TREE_TYPE (expr);
5793     }
5794
5795   /* [expr.static.cast]
5796
5797      An expression e can be explicitly converted to a type T using a
5798      static_cast of the form static_cast<T>(e) if the declaration T
5799      t(e);" is well-formed, for some invented temporary variable
5800      t.  */
5801   result = perform_direct_initialization_if_possible (type, expr,
5802                                                       c_cast_p, complain);
5803   if (result)
5804     {
5805       result = convert_from_reference (result);
5806
5807       /* Ignore any integer overflow caused by the cast.  */
5808       result = ignore_overflows (result, orig);
5809
5810       /* [expr.static.cast]
5811
5812          If T is a reference type, the result is an lvalue; otherwise,
5813          the result is an rvalue.  */
5814       if (TREE_CODE (type) != REFERENCE_TYPE)
5815         result = rvalue (result);
5816       return result;
5817     }
5818
5819   /* [expr.static.cast]
5820
5821      Any expression can be explicitly converted to type cv void.  */
5822   if (TREE_CODE (type) == VOID_TYPE)
5823     return convert_to_void (expr, /*implicit=*/NULL, complain);
5824
5825   /* [expr.static.cast]
5826
5827      The inverse of any standard conversion sequence (clause _conv_),
5828      other than the lvalue-to-rvalue (_conv.lval_), array-to-pointer
5829      (_conv.array_), function-to-pointer (_conv.func_), and boolean
5830      (_conv.bool_) conversions, can be performed explicitly using
5831      static_cast subject to the restriction that the explicit
5832      conversion does not cast away constness (_expr.const.cast_), and
5833      the following additional rules for specific cases:  */
5834   /* For reference, the conversions not excluded are: integral
5835      promotions, floating point promotion, integral conversions,
5836      floating point conversions, floating-integral conversions,
5837      pointer conversions, and pointer to member conversions.  */
5838   /* DR 128
5839
5840      A value of integral _or enumeration_ type can be explicitly
5841      converted to an enumeration type.  */
5842   /* The effect of all that is that any conversion between any two
5843      types which are integral, floating, or enumeration types can be
5844      performed.  */
5845   if ((INTEGRAL_OR_ENUMERATION_TYPE_P (type)
5846        || SCALAR_FLOAT_TYPE_P (type))
5847       && (INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
5848           || SCALAR_FLOAT_TYPE_P (intype)))
5849     {
5850       expr = ocp_convert (type, expr, CONV_C_CAST, LOOKUP_NORMAL);
5851
5852       /* Ignore any integer overflow caused by the cast.  */
5853       expr = ignore_overflows (expr, orig);
5854       return expr;
5855     }
5856
5857   if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
5858       && CLASS_TYPE_P (TREE_TYPE (type))
5859       && CLASS_TYPE_P (TREE_TYPE (intype))
5860       && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
5861                                           (TREE_TYPE (intype))),
5862                       build_pointer_type (TYPE_MAIN_VARIANT
5863                                           (TREE_TYPE (type)))))
5864     {
5865       tree base;
5866
5867       if (!c_cast_p)
5868         check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
5869       base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
5870                           c_cast_p ? ba_unique : ba_check,
5871                           NULL);
5872       return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
5873     }
5874
5875   if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
5876       || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
5877     {
5878       tree c1;
5879       tree c2;
5880       tree t1;
5881       tree t2;
5882
5883       c1 = TYPE_PTRMEM_CLASS_TYPE (intype);
5884       c2 = TYPE_PTRMEM_CLASS_TYPE (type);
5885
5886       if (TYPE_PTRMEM_P (type))
5887         {
5888           t1 = (build_ptrmem_type
5889                 (c1,
5890                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
5891           t2 = (build_ptrmem_type
5892                 (c2,
5893                  TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
5894         }
5895       else
5896         {
5897           t1 = intype;
5898           t2 = type;
5899         }
5900       if (can_convert (t1, t2) || can_convert (t2, t1))
5901         {
5902           if (!c_cast_p)
5903             check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
5904           return convert_ptrmem (type, expr, /*allow_inverse_p=*/1,
5905                                  c_cast_p);
5906         }
5907     }
5908
5909   /* [expr.static.cast]
5910
5911      An rvalue of type "pointer to cv void" can be explicitly
5912      converted to a pointer to object type.  A value of type pointer
5913      to object converted to "pointer to cv void" and back to the
5914      original pointer type will have its original value.  */
5915   if (TREE_CODE (intype) == POINTER_TYPE
5916       && VOID_TYPE_P (TREE_TYPE (intype))
5917       && TYPE_PTROB_P (type))
5918     {
5919       if (!c_cast_p)
5920         check_for_casting_away_constness (intype, type, STATIC_CAST_EXPR);
5921       return build_nop (type, expr);
5922     }
5923
5924   *valid_p = false;
5925   return error_mark_node;
5926 }
5927
5928 /* Return an expression representing static_cast<TYPE>(EXPR).  */
5929
5930 tree
5931 build_static_cast (tree type, tree expr, tsubst_flags_t complain)
5932 {
5933   tree result;
5934   bool valid_p;
5935
5936   if (type == error_mark_node || expr == error_mark_node)
5937     return error_mark_node;
5938
5939   if (processing_template_decl)
5940     {
5941       expr = build_min (STATIC_CAST_EXPR, type, expr);
5942       /* We don't know if it will or will not have side effects.  */
5943       TREE_SIDE_EFFECTS (expr) = 1;
5944       return convert_from_reference (expr);
5945     }
5946
5947   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
5948      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
5949   if (TREE_CODE (type) != REFERENCE_TYPE
5950       && TREE_CODE (expr) == NOP_EXPR
5951       && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
5952     expr = TREE_OPERAND (expr, 0);
5953
5954   result = build_static_cast_1 (type, expr, /*c_cast_p=*/false, &valid_p,
5955                                 complain);
5956   if (valid_p)
5957     return result;
5958
5959   if (complain & tf_error)
5960     error ("invalid static_cast from type %qT to type %qT",
5961            TREE_TYPE (expr), type);
5962   return error_mark_node;
5963 }
5964
5965 /* EXPR is an expression with member function or pointer-to-member
5966    function type.  TYPE is a pointer type.  Converting EXPR to TYPE is
5967    not permitted by ISO C++, but we accept it in some modes.  If we
5968    are not in one of those modes, issue a diagnostic.  Return the
5969    converted expression.  */
5970
5971 tree
5972 convert_member_func_to_ptr (tree type, tree expr)
5973 {
5974   tree intype;
5975   tree decl;
5976
5977   intype = TREE_TYPE (expr);
5978   gcc_assert (TYPE_PTRMEMFUNC_P (intype)
5979               || TREE_CODE (intype) == METHOD_TYPE);
5980
5981   if (pedantic || warn_pmf2ptr)
5982     pedwarn (input_location, pedantic ? OPT_pedantic : OPT_Wpmf_conversions,
5983              "converting from %qT to %qT", intype, type);
5984
5985   if (TREE_CODE (intype) == METHOD_TYPE)
5986     expr = build_addr_func (expr);
5987   else if (TREE_CODE (expr) == PTRMEM_CST)
5988     expr = build_address (PTRMEM_CST_MEMBER (expr));
5989   else
5990     {
5991       decl = maybe_dummy_object (TYPE_PTRMEM_CLASS_TYPE (intype), 0);
5992       decl = build_address (decl);
5993       expr = get_member_function_from_ptrfunc (&decl, expr);
5994     }
5995
5996   return build_nop (type, expr);
5997 }
5998
5999 /* Return a representation for a reinterpret_cast from EXPR to TYPE.
6000    If C_CAST_P is true, this reinterpret cast is being done as part of
6001    a C-style cast.  If VALID_P is non-NULL, *VALID_P is set to
6002    indicate whether or not reinterpret_cast was valid.  */
6003
6004 static tree
6005 build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
6006                           bool *valid_p, tsubst_flags_t complain)
6007 {
6008   tree intype;
6009
6010   /* Assume the cast is invalid.  */
6011   if (valid_p)
6012     *valid_p = true;
6013
6014   if (type == error_mark_node || error_operand_p (expr))
6015     return error_mark_node;
6016
6017   intype = TREE_TYPE (expr);
6018
6019   /* Save casted types in the function's used types hash table.  */
6020   used_types_insert (type);
6021
6022   /* [expr.reinterpret.cast]
6023      An lvalue expression of type T1 can be cast to the type
6024      "reference to T2" if an expression of type "pointer to T1" can be
6025      explicitly converted to the type "pointer to T2" using a
6026      reinterpret_cast.  */
6027   if (TREE_CODE (type) == REFERENCE_TYPE)
6028     {
6029       if (! real_lvalue_p (expr))
6030         {
6031           if (complain & tf_error)
6032             error ("invalid cast of an rvalue expression of type "
6033                    "%qT to type %qT",
6034                    intype, type);
6035           return error_mark_node;
6036         }
6037
6038       /* Warn about a reinterpret_cast from "A*" to "B&" if "A" and
6039          "B" are related class types; the reinterpret_cast does not
6040          adjust the pointer.  */
6041       if (TYPE_PTR_P (intype)
6042           && (complain & tf_warning)
6043           && (comptypes (TREE_TYPE (intype), TREE_TYPE (type),
6044                          COMPARE_BASE | COMPARE_DERIVED)))
6045         warning (0, "casting %qT to %qT does not dereference pointer",
6046                  intype, type);
6047
6048       expr = cp_build_unary_op (ADDR_EXPR, expr, 0, complain);
6049
6050       if (warn_strict_aliasing > 2)
6051         strict_aliasing_warning (TREE_TYPE (expr), type, expr);
6052
6053       if (expr != error_mark_node)
6054         expr = build_reinterpret_cast_1
6055           (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p,
6056            valid_p, complain);
6057       if (expr != error_mark_node)
6058         /* cp_build_indirect_ref isn't right for rvalue refs.  */
6059         expr = convert_from_reference (fold_convert (type, expr));
6060       return expr;
6061     }
6062
6063   /* As a G++ extension, we consider conversions from member
6064      functions, and pointers to member functions to
6065      pointer-to-function and pointer-to-void types.  If
6066      -Wno-pmf-conversions has not been specified,
6067      convert_member_func_to_ptr will issue an error message.  */
6068   if ((TYPE_PTRMEMFUNC_P (intype)
6069        || TREE_CODE (intype) == METHOD_TYPE)
6070       && TYPE_PTR_P (type)
6071       && (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
6072           || VOID_TYPE_P (TREE_TYPE (type))))
6073     return convert_member_func_to_ptr (type, expr);
6074
6075   /* If the cast is not to a reference type, the lvalue-to-rvalue,
6076      array-to-pointer, and function-to-pointer conversions are
6077      performed.  */
6078   expr = decay_conversion (expr);
6079
6080   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6081      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
6082   if (TREE_CODE (expr) == NOP_EXPR
6083       && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
6084     expr = TREE_OPERAND (expr, 0);
6085
6086   if (error_operand_p (expr))
6087     return error_mark_node;
6088
6089   intype = TREE_TYPE (expr);
6090
6091   /* [expr.reinterpret.cast]
6092      A pointer can be converted to any integral type large enough to
6093      hold it. ... A value of type std::nullptr_t can be converted to
6094      an integral type; the conversion has the same meaning and
6095      validity as a conversion of (void*)0 to the integral type.  */
6096   if (CP_INTEGRAL_TYPE_P (type)
6097       && (TYPE_PTR_P (intype) || NULLPTR_TYPE_P (intype)))
6098     {
6099       if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
6100         {
6101           if (complain & tf_error)
6102             permerror (input_location, "cast from %qT to %qT loses precision",
6103                        intype, type);
6104           else
6105             return error_mark_node;
6106         }
6107       if (NULLPTR_TYPE_P (intype))
6108         return build_int_cst (type, 0);
6109     }
6110   /* [expr.reinterpret.cast]
6111      A value of integral or enumeration type can be explicitly
6112      converted to a pointer.  */
6113   else if (TYPE_PTR_P (type) && INTEGRAL_OR_ENUMERATION_TYPE_P (intype))
6114     /* OK */
6115     ;
6116   else if ((TYPE_PTRFN_P (type) && TYPE_PTRFN_P (intype))
6117            || (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
6118     return fold_if_not_in_template (build_nop (type, expr));
6119   else if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
6120            || (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
6121     {
6122       tree sexpr = expr;
6123
6124       if (!c_cast_p)
6125         check_for_casting_away_constness (intype, type, REINTERPRET_CAST_EXPR);
6126       /* Warn about possible alignment problems.  */
6127       if (STRICT_ALIGNMENT && warn_cast_align
6128           && (complain & tf_warning)
6129           && !VOID_TYPE_P (type)
6130           && TREE_CODE (TREE_TYPE (intype)) != FUNCTION_TYPE
6131           && COMPLETE_TYPE_P (TREE_TYPE (type))
6132           && COMPLETE_TYPE_P (TREE_TYPE (intype))
6133           && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (intype)))
6134         warning (OPT_Wcast_align, "cast from %qT to %qT "
6135                  "increases required alignment of target type", intype, type);
6136
6137       /* We need to strip nops here, because the front end likes to
6138          create (int *)&a for array-to-pointer decay, instead of &a[0].  */
6139       STRIP_NOPS (sexpr);
6140       if (warn_strict_aliasing <= 2)
6141         strict_aliasing_warning (intype, type, sexpr);
6142
6143       return fold_if_not_in_template (build_nop (type, expr));
6144     }
6145   else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
6146            || (TYPE_PTRFN_P (intype) && TYPE_PTROBV_P (type)))
6147     {
6148       if (pedantic && (complain & tf_warning))
6149         /* Only issue a warning, as we have always supported this
6150            where possible, and it is necessary in some cases.  DR 195
6151            addresses this issue, but as of 2004/10/26 is still in
6152            drafting.  */
6153         warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
6154       return fold_if_not_in_template (build_nop (type, expr));
6155     }
6156   else if (TREE_CODE (type) == VECTOR_TYPE)
6157     return fold_if_not_in_template (convert_to_vector (type, expr));
6158   else if (TREE_CODE (intype) == VECTOR_TYPE
6159            && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
6160     return fold_if_not_in_template (convert_to_integer (type, expr));
6161   else
6162     {
6163       if (valid_p)
6164         *valid_p = false;
6165       if (complain & tf_error)
6166         error ("invalid cast from type %qT to type %qT", intype, type);
6167       return error_mark_node;
6168     }
6169
6170   return cp_convert (type, expr);
6171 }
6172
6173 tree
6174 build_reinterpret_cast (tree type, tree expr, tsubst_flags_t complain)
6175 {
6176   if (type == error_mark_node || expr == error_mark_node)
6177     return error_mark_node;
6178
6179   if (processing_template_decl)
6180     {
6181       tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
6182
6183       if (!TREE_SIDE_EFFECTS (t)
6184           && type_dependent_expression_p (expr))
6185         /* There might turn out to be side effects inside expr.  */
6186         TREE_SIDE_EFFECTS (t) = 1;
6187       return convert_from_reference (t);
6188     }
6189
6190   return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
6191                                    /*valid_p=*/NULL, complain);
6192 }
6193
6194 /* Perform a const_cast from EXPR to TYPE.  If the cast is valid,
6195    return an appropriate expression.  Otherwise, return
6196    error_mark_node.  If the cast is not valid, and COMPLAIN is true,
6197    then a diagnostic will be issued.  If VALID_P is non-NULL, we are
6198    performing a C-style cast, its value upon return will indicate
6199    whether or not the conversion succeeded.  */
6200
6201 static tree
6202 build_const_cast_1 (tree dst_type, tree expr, bool complain,
6203                     bool *valid_p)
6204 {
6205   tree src_type;
6206   tree reference_type;
6207
6208   /* Callers are responsible for handling error_mark_node as a
6209      destination type.  */
6210   gcc_assert (dst_type != error_mark_node);
6211   /* In a template, callers should be building syntactic
6212      representations of casts, not using this machinery.  */
6213   gcc_assert (!processing_template_decl);
6214
6215   /* Assume the conversion is invalid.  */
6216   if (valid_p)
6217     *valid_p = false;
6218
6219   if (!POINTER_TYPE_P (dst_type) && !TYPE_PTRMEM_P (dst_type))
6220     {
6221       if (complain)
6222         error ("invalid use of const_cast with type %qT, "
6223                "which is not a pointer, "
6224                "reference, nor a pointer-to-data-member type", dst_type);
6225       return error_mark_node;
6226     }
6227
6228   if (TREE_CODE (TREE_TYPE (dst_type)) == FUNCTION_TYPE)
6229     {
6230       if (complain)
6231         error ("invalid use of const_cast with type %qT, which is a pointer "
6232                "or reference to a function type", dst_type);
6233       return error_mark_node;
6234     }
6235
6236   /* Save casted types in the function's used types hash table.  */
6237   used_types_insert (dst_type);
6238
6239   src_type = TREE_TYPE (expr);
6240   /* Expressions do not really have reference types.  */
6241   if (TREE_CODE (src_type) == REFERENCE_TYPE)
6242     src_type = TREE_TYPE (src_type);
6243
6244   /* [expr.const.cast]
6245
6246      An lvalue of type T1 can be explicitly converted to an lvalue of
6247      type T2 using the cast const_cast<T2&> (where T1 and T2 are object
6248      types) if a pointer to T1 can be explicitly converted to the type
6249      pointer to T2 using a const_cast.  */
6250   if (TREE_CODE (dst_type) == REFERENCE_TYPE)
6251     {
6252       reference_type = dst_type;
6253       if (! real_lvalue_p (expr))
6254         {
6255           if (complain)
6256             error ("invalid const_cast of an rvalue of type %qT to type %qT",
6257                    src_type, dst_type);
6258           return error_mark_node;
6259         }
6260       dst_type = build_pointer_type (TREE_TYPE (dst_type));
6261       src_type = build_pointer_type (src_type);
6262     }
6263   else
6264     {
6265       reference_type = NULL_TREE;
6266       /* If the destination type is not a reference type, the
6267          lvalue-to-rvalue, array-to-pointer, and function-to-pointer
6268          conversions are performed.  */
6269       src_type = type_decays_to (src_type);
6270       if (src_type == error_mark_node)
6271         return error_mark_node;
6272     }
6273
6274   if ((TYPE_PTR_P (src_type) || TYPE_PTRMEM_P (src_type))
6275       && comp_ptr_ttypes_const (dst_type, src_type))
6276     {
6277       if (valid_p)
6278         {
6279           *valid_p = true;
6280           /* This cast is actually a C-style cast.  Issue a warning if
6281              the user is making a potentially unsafe cast.  */
6282           check_for_casting_away_constness (src_type, dst_type, CAST_EXPR);
6283         }
6284       if (reference_type)
6285         {
6286           expr = cp_build_unary_op (ADDR_EXPR, expr, 0, 
6287                                     complain? tf_warning_or_error : tf_none);
6288           expr = build_nop (reference_type, expr);
6289           return convert_from_reference (expr);
6290         }
6291       else
6292         {
6293           expr = decay_conversion (expr);
6294           /* build_c_cast puts on a NOP_EXPR to make the result not an
6295              lvalue.  Strip such NOP_EXPRs if VALUE is being used in
6296              non-lvalue context.  */
6297           if (TREE_CODE (expr) == NOP_EXPR
6298               && TREE_TYPE (expr) == TREE_TYPE (TREE_OPERAND (expr, 0)))
6299             expr = TREE_OPERAND (expr, 0);
6300           return build_nop (dst_type, expr);
6301         }
6302     }
6303
6304   if (complain)
6305     error ("invalid const_cast from type %qT to type %qT",
6306            src_type, dst_type);
6307   return error_mark_node;
6308 }
6309
6310 tree
6311 build_const_cast (tree type, tree expr, tsubst_flags_t complain)
6312 {
6313   if (type == error_mark_node || error_operand_p (expr))
6314     return error_mark_node;
6315
6316   if (processing_template_decl)
6317     {
6318       tree t = build_min (CONST_CAST_EXPR, type, expr);
6319
6320       if (!TREE_SIDE_EFFECTS (t)
6321           && type_dependent_expression_p (expr))
6322         /* There might turn out to be side effects inside expr.  */
6323         TREE_SIDE_EFFECTS (t) = 1;
6324       return convert_from_reference (t);
6325     }
6326
6327   return build_const_cast_1 (type, expr, complain & tf_error,
6328                              /*valid_p=*/NULL);
6329 }
6330
6331 /* Like cp_build_c_cast, but for the c-common bits.  */
6332
6333 tree
6334 build_c_cast (location_t loc ATTRIBUTE_UNUSED, tree type, tree expr)
6335 {
6336   return cp_build_c_cast (type, expr, tf_warning_or_error);
6337 }
6338
6339 /* Build an expression representing an explicit C-style cast to type
6340    TYPE of expression EXPR.  */
6341
6342 tree
6343 cp_build_c_cast (tree type, tree expr, tsubst_flags_t complain)
6344 {
6345   tree value = expr;
6346   tree result;
6347   bool valid_p;
6348
6349   if (type == error_mark_node || error_operand_p (expr))
6350     return error_mark_node;
6351
6352   if (processing_template_decl)
6353     {
6354       tree t = build_min (CAST_EXPR, type,
6355                           tree_cons (NULL_TREE, value, NULL_TREE));
6356       /* We don't know if it will or will not have side effects.  */
6357       TREE_SIDE_EFFECTS (t) = 1;
6358       return convert_from_reference (t);
6359     }
6360
6361   /* Casts to a (pointer to a) specific ObjC class (or 'id' or
6362      'Class') should always be retained, because this information aids
6363      in method lookup.  */
6364   if (objc_is_object_ptr (type)
6365       && objc_is_object_ptr (TREE_TYPE (expr)))
6366     return build_nop (type, expr);
6367
6368   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
6369      Strip such NOP_EXPRs if VALUE is being used in non-lvalue context.  */
6370   if (TREE_CODE (type) != REFERENCE_TYPE
6371       && TREE_CODE (value) == NOP_EXPR
6372       && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
6373     value = TREE_OPERAND (value, 0);
6374
6375   if (TREE_CODE (type) == ARRAY_TYPE)
6376     {
6377       /* Allow casting from T1* to T2[] because Cfront allows it.
6378          NIHCL uses it. It is not valid ISO C++ however.  */
6379       if (TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
6380         {
6381           if (complain & tf_error)
6382             permerror (input_location, "ISO C++ forbids casting to an array type %qT", type);
6383           else
6384             return error_mark_node;
6385           type = build_pointer_type (TREE_TYPE (type));
6386         }
6387       else
6388         {
6389           if (complain & tf_error)
6390             error ("ISO C++ forbids casting to an array type %qT", type);
6391           return error_mark_node;
6392         }
6393     }
6394
6395   if (TREE_CODE (type) == FUNCTION_TYPE
6396       || TREE_CODE (type) == METHOD_TYPE)
6397     {
6398       if (complain & tf_error)
6399         error ("invalid cast to function type %qT", type);
6400       return error_mark_node;
6401     }
6402
6403   if (TREE_CODE (type) == POINTER_TYPE
6404       && TREE_CODE (TREE_TYPE (value)) == INTEGER_TYPE
6405       /* Casting to an integer of smaller size is an error detected elsewhere.  */
6406       && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (value))
6407       /* Don't warn about converting any constant.  */
6408       && !TREE_CONSTANT (value))
6409     warning_at (input_location, OPT_Wint_to_pointer_cast, 
6410                 "cast to pointer from integer of different size");
6411
6412   /* A C-style cast can be a const_cast.  */
6413   result = build_const_cast_1 (type, value, /*complain=*/false,
6414                                &valid_p);
6415   if (valid_p)
6416     return result;
6417
6418   /* Or a static cast.  */
6419   result = build_static_cast_1 (type, value, /*c_cast_p=*/true,
6420                                 &valid_p, complain);
6421   /* Or a reinterpret_cast.  */
6422   if (!valid_p)
6423     result = build_reinterpret_cast_1 (type, value, /*c_cast_p=*/true,
6424                                        &valid_p, complain);
6425   /* The static_cast or reinterpret_cast may be followed by a
6426      const_cast.  */
6427   if (valid_p
6428       /* A valid cast may result in errors if, for example, a
6429          conversion to am ambiguous base class is required.  */
6430       && !error_operand_p (result))
6431     {
6432       tree result_type;
6433
6434       /* Non-class rvalues always have cv-unqualified type.  */
6435       if (!CLASS_TYPE_P (type))
6436         type = TYPE_MAIN_VARIANT (type);
6437       result_type = TREE_TYPE (result);
6438       if (!CLASS_TYPE_P (result_type))
6439         result_type = TYPE_MAIN_VARIANT (result_type);
6440       /* If the type of RESULT does not match TYPE, perform a
6441          const_cast to make it match.  If the static_cast or
6442          reinterpret_cast succeeded, we will differ by at most
6443          cv-qualification, so the follow-on const_cast is guaranteed
6444          to succeed.  */
6445       if (!same_type_p (non_reference (type), non_reference (result_type)))
6446         {
6447           result = build_const_cast_1 (type, result, false, &valid_p);
6448           gcc_assert (valid_p);
6449         }
6450       return result;
6451     }
6452
6453   return error_mark_node;
6454 }
6455 \f
6456 /* For use from the C common bits.  */
6457 tree
6458 build_modify_expr (location_t location ATTRIBUTE_UNUSED,
6459                    tree lhs, tree lhs_origtype ATTRIBUTE_UNUSED,
6460                    enum tree_code modifycode, 
6461                    location_t rhs_location ATTRIBUTE_UNUSED, tree rhs,
6462                    tree rhs_origtype ATTRIBUTE_UNUSED)
6463 {
6464   return cp_build_modify_expr (lhs, modifycode, rhs, tf_warning_or_error);
6465 }
6466
6467 /* Build an assignment expression of lvalue LHS from value RHS.
6468    MODIFYCODE is the code for a binary operator that we use
6469    to combine the old value of LHS with RHS to get the new value.
6470    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.
6471
6472    C++: If MODIFYCODE is INIT_EXPR, then leave references unbashed.  */
6473
6474 tree
6475 cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
6476                       tsubst_flags_t complain)
6477 {
6478   tree result;
6479   tree newrhs = rhs;
6480   tree lhstype = TREE_TYPE (lhs);
6481   tree olhstype = lhstype;
6482   bool plain_assign = (modifycode == NOP_EXPR);
6483
6484   /* Avoid duplicate error messages from operands that had errors.  */
6485   if (error_operand_p (lhs) || error_operand_p (rhs))
6486     return error_mark_node;
6487
6488   /* Handle control structure constructs used as "lvalues".  */
6489   switch (TREE_CODE (lhs))
6490     {
6491       /* Handle --foo = 5; as these are valid constructs in C++.  */
6492     case PREDECREMENT_EXPR:
6493     case PREINCREMENT_EXPR:
6494       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
6495         lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
6496                       stabilize_reference (TREE_OPERAND (lhs, 0)),
6497                       TREE_OPERAND (lhs, 1));
6498       newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 0),
6499                                      modifycode, rhs, complain);
6500       if (newrhs == error_mark_node)
6501         return error_mark_node;
6502       return build2 (COMPOUND_EXPR, lhstype, lhs, newrhs);
6503
6504       /* Handle (a, b) used as an "lvalue".  */
6505     case COMPOUND_EXPR:
6506       newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 1),
6507                                      modifycode, rhs, complain);
6508       if (newrhs == error_mark_node)
6509         return error_mark_node;
6510       return build2 (COMPOUND_EXPR, lhstype,
6511                      TREE_OPERAND (lhs, 0), newrhs);
6512
6513     case MODIFY_EXPR:
6514       if (TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0)))
6515         lhs = build2 (TREE_CODE (lhs), TREE_TYPE (lhs),
6516                       stabilize_reference (TREE_OPERAND (lhs, 0)),
6517                       TREE_OPERAND (lhs, 1));
6518       newrhs = cp_build_modify_expr (TREE_OPERAND (lhs, 0), modifycode, rhs,
6519                                      complain);
6520       if (newrhs == error_mark_node)
6521         return error_mark_node;
6522       return build2 (COMPOUND_EXPR, lhstype, lhs, newrhs);
6523
6524     case MIN_EXPR:
6525     case MAX_EXPR:
6526       /* MIN_EXPR and MAX_EXPR are currently only permitted as lvalues,
6527          when neither operand has side-effects.  */
6528       if (!lvalue_or_else (lhs, lv_assign, complain))
6529         return error_mark_node;
6530
6531       gcc_assert (!TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 0))
6532                   && !TREE_SIDE_EFFECTS (TREE_OPERAND (lhs, 1)));
6533
6534       lhs = build3 (COND_EXPR, TREE_TYPE (lhs),
6535                     build2 (TREE_CODE (lhs) == MIN_EXPR ? LE_EXPR : GE_EXPR,
6536                             boolean_type_node,
6537                             TREE_OPERAND (lhs, 0),
6538                             TREE_OPERAND (lhs, 1)),
6539                     TREE_OPERAND (lhs, 0),
6540                     TREE_OPERAND (lhs, 1));
6541       /* Fall through.  */
6542
6543       /* Handle (a ? b : c) used as an "lvalue".  */
6544     case COND_EXPR:
6545       {
6546         /* Produce (a ? (b = rhs) : (c = rhs))
6547            except that the RHS goes through a save-expr
6548            so the code to compute it is only emitted once.  */
6549         tree cond;
6550         tree preeval = NULL_TREE;
6551
6552         if (VOID_TYPE_P (TREE_TYPE (rhs)))
6553           {
6554             if (complain & tf_error)
6555               error ("void value not ignored as it ought to be");
6556             return error_mark_node;
6557           }
6558
6559         rhs = stabilize_expr (rhs, &preeval);
6560
6561         /* Check this here to avoid odd errors when trying to convert
6562            a throw to the type of the COND_EXPR.  */
6563         if (!lvalue_or_else (lhs, lv_assign, complain))
6564           return error_mark_node;
6565
6566         cond = build_conditional_expr
6567           (TREE_OPERAND (lhs, 0),
6568            cp_build_modify_expr (TREE_OPERAND (lhs, 1),
6569                                  modifycode, rhs, complain),
6570            cp_build_modify_expr (TREE_OPERAND (lhs, 2),
6571                                  modifycode, rhs, complain),
6572            complain);
6573
6574         if (cond == error_mark_node)
6575           return cond;
6576         /* Make sure the code to compute the rhs comes out
6577            before the split.  */
6578         if (preeval)
6579           cond = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
6580         return cond;
6581       }
6582
6583     default:
6584       break;
6585     }
6586
6587   if (modifycode == INIT_EXPR)
6588     {
6589       if (BRACE_ENCLOSED_INITIALIZER_P (rhs))
6590         /* Do the default thing.  */;
6591       else if (TREE_CODE (rhs) == CONSTRUCTOR)
6592         {
6593           /* Compound literal.  */
6594           if (! same_type_p (TREE_TYPE (rhs), lhstype))
6595             /* Call convert to generate an error; see PR 11063.  */
6596             rhs = convert (lhstype, rhs);
6597           result = build2 (INIT_EXPR, lhstype, lhs, rhs);
6598           TREE_SIDE_EFFECTS (result) = 1;
6599           return result;
6600         }
6601       else if (! MAYBE_CLASS_TYPE_P (lhstype))
6602         /* Do the default thing.  */;
6603       else
6604         {
6605           VEC(tree,gc) *rhs_vec = make_tree_vector_single (rhs);
6606           result = build_special_member_call (lhs, complete_ctor_identifier,
6607                                               &rhs_vec, lhstype, LOOKUP_NORMAL,
6608                                               complain);
6609           release_tree_vector (rhs_vec);
6610           if (result == NULL_TREE)
6611             return error_mark_node;
6612           return result;
6613         }
6614     }
6615   else
6616     {
6617       lhs = require_complete_type (lhs);
6618       if (lhs == error_mark_node)
6619         return error_mark_node;
6620
6621       if (modifycode == NOP_EXPR)
6622         {
6623           /* `operator=' is not an inheritable operator.  */
6624           if (! MAYBE_CLASS_TYPE_P (lhstype))
6625             /* Do the default thing.  */;
6626           else
6627             {
6628               result = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL,
6629                                      lhs, rhs, make_node (NOP_EXPR),
6630                                      /*overloaded_p=*/NULL, 
6631                                      complain);
6632               if (result == NULL_TREE)
6633                 return error_mark_node;
6634               return result;
6635             }
6636           lhstype = olhstype;
6637         }
6638       else
6639         {
6640           /* A binary op has been requested.  Combine the old LHS
6641              value with the RHS producing the value we should actually
6642              store into the LHS.  */
6643           gcc_assert (!((TREE_CODE (lhstype) == REFERENCE_TYPE
6644                          && MAYBE_CLASS_TYPE_P (TREE_TYPE (lhstype)))
6645                         || MAYBE_CLASS_TYPE_P (lhstype)));
6646
6647           lhs = stabilize_reference (lhs);
6648           newrhs = cp_build_binary_op (input_location,
6649                                        modifycode, lhs, rhs,
6650                                        complain);
6651           if (newrhs == error_mark_node)
6652             {
6653               if (complain & tf_error)
6654                 error ("  in evaluation of %<%Q(%#T, %#T)%>", modifycode,
6655                        TREE_TYPE (lhs), TREE_TYPE (rhs));
6656               return error_mark_node;
6657             }
6658
6659           /* Now it looks like a plain assignment.  */
6660           modifycode = NOP_EXPR;
6661         }
6662       gcc_assert (TREE_CODE (lhstype) != REFERENCE_TYPE);
6663       gcc_assert (TREE_CODE (TREE_TYPE (newrhs)) != REFERENCE_TYPE);
6664     }
6665
6666   /* The left-hand side must be an lvalue.  */
6667   if (!lvalue_or_else (lhs, lv_assign, complain))
6668     return error_mark_node;
6669
6670   /* Warn about modifying something that is `const'.  Don't warn if
6671      this is initialization.  */
6672   if (modifycode != INIT_EXPR
6673       && (TREE_READONLY (lhs) || CP_TYPE_CONST_P (lhstype)
6674           /* Functions are not modifiable, even though they are
6675              lvalues.  */
6676           || TREE_CODE (TREE_TYPE (lhs)) == FUNCTION_TYPE
6677           || TREE_CODE (TREE_TYPE (lhs)) == METHOD_TYPE
6678           /* If it's an aggregate and any field is const, then it is
6679              effectively const.  */
6680           || (CLASS_TYPE_P (lhstype)
6681               && C_TYPE_FIELDS_READONLY (lhstype))))
6682     {
6683       if (complain & tf_error)
6684         readonly_error (lhs, REK_ASSIGNMENT);
6685       else
6686         return error_mark_node;
6687     }
6688
6689   /* If storing into a structure or union member, it may have been given a
6690      lowered bitfield type.  We need to convert to the declared type first,
6691      so retrieve it now.  */
6692
6693   olhstype = unlowered_expr_type (lhs);
6694
6695   /* Convert new value to destination type.  */
6696
6697   if (TREE_CODE (lhstype) == ARRAY_TYPE)
6698     {
6699       int from_array;
6700
6701       if (BRACE_ENCLOSED_INITIALIZER_P (newrhs))
6702         {
6703           if (modifycode != INIT_EXPR)
6704             {
6705               if (complain & tf_error)
6706                 error ("assigning to an array from an initializer list");
6707               return error_mark_node;
6708             }
6709           if (check_array_initializer (lhs, lhstype, newrhs))
6710             return error_mark_node;
6711           newrhs = digest_init (lhstype, newrhs);
6712         }
6713
6714       else if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
6715                                      TYPE_MAIN_VARIANT (TREE_TYPE (newrhs))))
6716         {
6717           if (complain & tf_error)
6718             error ("incompatible types in assignment of %qT to %qT",
6719                    TREE_TYPE (rhs), lhstype);
6720           return error_mark_node;
6721         }
6722
6723       /* Allow array assignment in compiler-generated code.  */
6724       else if (!current_function_decl
6725                || !DECL_ARTIFICIAL (current_function_decl))
6726         {
6727           /* This routine is used for both initialization and assignment.
6728              Make sure the diagnostic message differentiates the context.  */
6729           if (complain & tf_error)
6730             {
6731               if (modifycode == INIT_EXPR)
6732                 error ("array used as initializer");
6733               else
6734                 error ("invalid array assignment");
6735             }
6736           return error_mark_node;
6737         }
6738
6739       from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
6740                    ? 1 + (modifycode != INIT_EXPR): 0;
6741       return build_vec_init (lhs, NULL_TREE, newrhs,
6742                              /*explicit_value_init_p=*/false,
6743                              from_array, complain);
6744     }
6745
6746   if (modifycode == INIT_EXPR)
6747     /* Calls with INIT_EXPR are all direct-initialization, so don't set
6748        LOOKUP_ONLYCONVERTING.  */
6749     newrhs = convert_for_initialization (lhs, olhstype, newrhs, LOOKUP_NORMAL,
6750                                          "initialization", NULL_TREE, 0,
6751                                          complain);
6752   else
6753     newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
6754                                      NULL_TREE, 0, complain, LOOKUP_IMPLICIT);
6755
6756   if (!same_type_p (lhstype, olhstype))
6757     newrhs = cp_convert_and_check (lhstype, newrhs);
6758
6759   if (modifycode != INIT_EXPR)
6760     {
6761       if (TREE_CODE (newrhs) == CALL_EXPR
6762           && TYPE_NEEDS_CONSTRUCTING (lhstype))
6763         newrhs = build_cplus_new (lhstype, newrhs);
6764
6765       /* Can't initialize directly from a TARGET_EXPR, since that would
6766          cause the lhs to be constructed twice, and possibly result in
6767          accidental self-initialization.  So we force the TARGET_EXPR to be
6768          expanded without a target.  */
6769       if (TREE_CODE (newrhs) == TARGET_EXPR)
6770         newrhs = build2 (COMPOUND_EXPR, TREE_TYPE (newrhs), newrhs,
6771                          TREE_OPERAND (newrhs, 0));
6772     }
6773
6774   if (newrhs == error_mark_node)
6775     return error_mark_node;
6776
6777   if (c_dialect_objc () && flag_objc_gc)
6778     {
6779       result = objc_generate_write_barrier (lhs, modifycode, newrhs);
6780
6781       if (result)
6782         return result;
6783     }
6784
6785   result = build2 (modifycode == NOP_EXPR ? MODIFY_EXPR : INIT_EXPR,
6786                    lhstype, lhs, newrhs);
6787
6788   TREE_SIDE_EFFECTS (result) = 1;
6789   if (!plain_assign)
6790     TREE_NO_WARNING (result) = 1;
6791
6792   return result;
6793 }
6794
6795 tree
6796 build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs,
6797                      tsubst_flags_t complain)
6798 {
6799   if (processing_template_decl)
6800     return build_min_nt (MODOP_EXPR, lhs,
6801                          build_min_nt (modifycode, NULL_TREE, NULL_TREE), rhs);
6802
6803   if (modifycode != NOP_EXPR)
6804     {
6805       tree rval = build_new_op (MODIFY_EXPR, LOOKUP_NORMAL, lhs, rhs,
6806                                 make_node (modifycode),
6807                                 /*overloaded_p=*/NULL,
6808                                 complain);
6809       if (rval)
6810         {
6811           TREE_NO_WARNING (rval) = 1;
6812           return rval;
6813         }
6814     }
6815   return cp_build_modify_expr (lhs, modifycode, rhs, complain);
6816 }
6817
6818 /* Helper function for get_delta_difference which assumes FROM is a base
6819    class of TO.  Returns a delta for the conversion of pointer-to-member
6820    of FROM to pointer-to-member of TO.  If the conversion is invalid,
6821    returns zero.  If FROM is not a base class of TO, returns NULL_TREE.
6822    If C_CAST_P is true, this conversion is taking place as part of a C-style
6823    cast.  */
6824
6825 static tree
6826 get_delta_difference_1 (tree from, tree to, bool c_cast_p)
6827 {
6828   tree binfo;
6829   base_kind kind;
6830
6831   binfo = lookup_base (to, from, c_cast_p ? ba_unique : ba_check, &kind);
6832   if (kind == bk_inaccessible || kind == bk_ambig)
6833     {
6834       error ("   in pointer to member function conversion");
6835       return size_zero_node;
6836     }
6837   else if (binfo)
6838     {
6839       if (kind != bk_via_virtual)
6840         return BINFO_OFFSET (binfo);
6841       else
6842         /* FROM is a virtual base class of TO.  Issue an error or warning
6843            depending on whether or not this is a reinterpret cast.  */
6844         {
6845           error ("pointer to member conversion via virtual base %qT",
6846                  BINFO_TYPE (binfo_from_vbase (binfo)));
6847
6848           return size_zero_node;
6849         }
6850       }
6851     else
6852       return NULL_TREE;
6853 }
6854
6855 /* Get difference in deltas for different pointer to member function
6856    types.  Returns an integer constant of type PTRDIFF_TYPE_NODE.  If
6857    the conversion is invalid, the constant is zero.  If
6858    ALLOW_INVERSE_P is true, then allow reverse conversions as well.
6859    If C_CAST_P is true this conversion is taking place as part of a
6860    C-style cast.
6861
6862    Note that the naming of FROM and TO is kind of backwards; the return
6863    value is what we add to a TO in order to get a FROM.  They are named
6864    this way because we call this function to find out how to convert from
6865    a pointer to member of FROM to a pointer to member of TO.  */
6866
6867 static tree
6868 get_delta_difference (tree from, tree to,
6869                       bool allow_inverse_p,
6870                       bool c_cast_p)
6871 {
6872   tree result;
6873
6874   if (same_type_ignoring_top_level_qualifiers_p (from, to))
6875     /* Pointer to member of incomplete class is permitted*/
6876     result = size_zero_node;
6877   else
6878     result = get_delta_difference_1 (from, to, c_cast_p);
6879
6880   if (!result)
6881   {
6882     if (!allow_inverse_p)
6883       {
6884         error_not_base_type (from, to);
6885         error ("   in pointer to member conversion");
6886         result = size_zero_node;
6887       }
6888     else
6889       {
6890         result = get_delta_difference_1 (to, from, c_cast_p);
6891
6892         if (result)
6893           result = size_diffop_loc (input_location,
6894                                 size_zero_node, result);
6895         else
6896           {
6897             error_not_base_type (from, to);
6898             error ("   in pointer to member conversion");
6899             result = size_zero_node;
6900           }
6901       }
6902   }
6903
6904   return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
6905                                                       result));
6906 }
6907
6908 /* Return a constructor for the pointer-to-member-function TYPE using
6909    the other components as specified.  */
6910
6911 tree
6912 build_ptrmemfunc1 (tree type, tree delta, tree pfn)
6913 {
6914   tree u = NULL_TREE;
6915   tree delta_field;
6916   tree pfn_field;
6917   VEC(constructor_elt, gc) *v;
6918
6919   /* Pull the FIELD_DECLs out of the type.  */
6920   pfn_field = TYPE_FIELDS (type);
6921   delta_field = TREE_CHAIN (pfn_field);
6922
6923   /* Make sure DELTA has the type we want.  */
6924   delta = convert_and_check (delta_type_node, delta);
6925
6926   /* Convert to the correct target type if necessary.  */
6927   pfn = fold_convert (TREE_TYPE (pfn_field), pfn);
6928
6929   /* Finish creating the initializer.  */
6930   v = VEC_alloc(constructor_elt, gc, 2);
6931   CONSTRUCTOR_APPEND_ELT(v, pfn_field, pfn);
6932   CONSTRUCTOR_APPEND_ELT(v, delta_field, delta);
6933   u = build_constructor (type, v);
6934   TREE_CONSTANT (u) = TREE_CONSTANT (pfn) & TREE_CONSTANT (delta);
6935   TREE_STATIC (u) = (TREE_CONSTANT (u)
6936                      && (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
6937                          != NULL_TREE)
6938                      && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
6939                          != NULL_TREE));
6940   return u;
6941 }
6942
6943 /* Build a constructor for a pointer to member function.  It can be
6944    used to initialize global variables, local variable, or used
6945    as a value in expressions.  TYPE is the POINTER to METHOD_TYPE we
6946    want to be.
6947
6948    If FORCE is nonzero, then force this conversion, even if
6949    we would rather not do it.  Usually set when using an explicit
6950    cast.  A C-style cast is being processed iff C_CAST_P is true.
6951
6952    Return error_mark_node, if something goes wrong.  */
6953
6954 tree
6955 build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p)
6956 {
6957   tree fn;
6958   tree pfn_type;
6959   tree to_type;
6960
6961   if (error_operand_p (pfn))
6962     return error_mark_node;
6963
6964   pfn_type = TREE_TYPE (pfn);
6965   to_type = build_ptrmemfunc_type (type);
6966
6967   /* Handle multiple conversions of pointer to member functions.  */
6968   if (TYPE_PTRMEMFUNC_P (pfn_type))
6969     {
6970       tree delta = NULL_TREE;
6971       tree npfn = NULL_TREE;
6972       tree n;
6973
6974       if (!force
6975           && !can_convert_arg (to_type, TREE_TYPE (pfn), pfn, LOOKUP_NORMAL))
6976         error ("invalid conversion to type %qT from type %qT",
6977                to_type, pfn_type);
6978
6979       n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
6980                                 TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
6981                                 force,
6982                                 c_cast_p);
6983
6984       /* We don't have to do any conversion to convert a
6985          pointer-to-member to its own type.  But, we don't want to
6986          just return a PTRMEM_CST if there's an explicit cast; that
6987          cast should make the expression an invalid template argument.  */
6988       if (TREE_CODE (pfn) != PTRMEM_CST)
6989         {
6990           if (same_type_p (to_type, pfn_type))
6991             return pfn;
6992           else if (integer_zerop (n))
6993             return build_reinterpret_cast (to_type, pfn, 
6994                                            tf_warning_or_error);
6995         }
6996
6997       if (TREE_SIDE_EFFECTS (pfn))
6998         pfn = save_expr (pfn);
6999
7000       /* Obtain the function pointer and the current DELTA.  */
7001       if (TREE_CODE (pfn) == PTRMEM_CST)
7002         expand_ptrmemfunc_cst (pfn, &delta, &npfn);
7003       else
7004         {
7005           npfn = build_ptrmemfunc_access_expr (pfn, pfn_identifier);
7006           delta = build_ptrmemfunc_access_expr (pfn, delta_identifier);
7007         }
7008
7009       /* Just adjust the DELTA field.  */
7010       gcc_assert  (same_type_ignoring_top_level_qualifiers_p
7011                    (TREE_TYPE (delta), ptrdiff_type_node));
7012       if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_delta)
7013         n = cp_build_binary_op (input_location,
7014                                 LSHIFT_EXPR, n, integer_one_node,
7015                                 tf_warning_or_error);
7016       delta = cp_build_binary_op (input_location,
7017                                   PLUS_EXPR, delta, n, tf_warning_or_error);
7018       return build_ptrmemfunc1 (to_type, delta, npfn);
7019     }
7020
7021   /* Handle null pointer to member function conversions.  */
7022   if (integer_zerop (pfn))
7023     {
7024       pfn = build_c_cast (input_location, type, integer_zero_node);
7025       return build_ptrmemfunc1 (to_type,
7026                                 integer_zero_node,
7027                                 pfn);
7028     }
7029
7030   if (type_unknown_p (pfn))
7031     return instantiate_type (type, pfn, tf_warning_or_error);
7032
7033   fn = TREE_OPERAND (pfn, 0);
7034   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
7035               /* In a template, we will have preserved the
7036                  OFFSET_REF.  */
7037               || (processing_template_decl && TREE_CODE (fn) == OFFSET_REF));
7038   return make_ptrmem_cst (to_type, fn);
7039 }
7040
7041 /* Return the DELTA, IDX, PFN, and DELTA2 values for the PTRMEM_CST
7042    given by CST.
7043
7044    ??? There is no consistency as to the types returned for the above
7045    values.  Some code acts as if it were a sizetype and some as if it were
7046    integer_type_node.  */
7047
7048 void
7049 expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
7050 {
7051   tree type = TREE_TYPE (cst);
7052   tree fn = PTRMEM_CST_MEMBER (cst);
7053   tree ptr_class, fn_class;
7054
7055   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
7056
7057   /* The class that the function belongs to.  */
7058   fn_class = DECL_CONTEXT (fn);
7059
7060   /* The class that we're creating a pointer to member of.  */
7061   ptr_class = TYPE_PTRMEMFUNC_OBJECT_TYPE (type);
7062
7063   /* First, calculate the adjustment to the function's class.  */
7064   *delta = get_delta_difference (fn_class, ptr_class, /*force=*/0,
7065                                  /*c_cast_p=*/0);
7066
7067   if (!DECL_VIRTUAL_P (fn))
7068     *pfn = convert (TYPE_PTRMEMFUNC_FN_TYPE (type), build_addr_func (fn));
7069   else
7070     {
7071       /* If we're dealing with a virtual function, we have to adjust 'this'
7072          again, to point to the base which provides the vtable entry for
7073          fn; the call will do the opposite adjustment.  */
7074       tree orig_class = DECL_CONTEXT (fn);
7075       tree binfo = binfo_or_else (orig_class, fn_class);
7076       *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
7077                        *delta, BINFO_OFFSET (binfo));
7078       *delta = fold_if_not_in_template (*delta);
7079
7080       /* We set PFN to the vtable offset at which the function can be
7081          found, plus one (unless ptrmemfunc_vbit_in_delta, in which
7082          case delta is shifted left, and then incremented).  */
7083       *pfn = DECL_VINDEX (fn);
7084       *pfn = build2 (MULT_EXPR, integer_type_node, *pfn,
7085                      TYPE_SIZE_UNIT (vtable_entry_type));
7086       *pfn = fold_if_not_in_template (*pfn);
7087
7088       switch (TARGET_PTRMEMFUNC_VBIT_LOCATION)
7089         {
7090         case ptrmemfunc_vbit_in_pfn:
7091           *pfn = build2 (PLUS_EXPR, integer_type_node, *pfn,
7092                          integer_one_node);
7093           *pfn = fold_if_not_in_template (*pfn);
7094           break;
7095
7096         case ptrmemfunc_vbit_in_delta:
7097           *delta = build2 (LSHIFT_EXPR, TREE_TYPE (*delta),
7098                            *delta, integer_one_node);
7099           *delta = fold_if_not_in_template (*delta);
7100           *delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
7101                            *delta, integer_one_node);
7102           *delta = fold_if_not_in_template (*delta);
7103           break;
7104
7105         default:
7106           gcc_unreachable ();
7107         }
7108
7109       *pfn = build_nop (TYPE_PTRMEMFUNC_FN_TYPE (type), *pfn);
7110       *pfn = fold_if_not_in_template (*pfn);
7111     }
7112 }
7113
7114 /* Return an expression for PFN from the pointer-to-member function
7115    given by T.  */
7116
7117 static tree
7118 pfn_from_ptrmemfunc (tree t)
7119 {
7120   if (TREE_CODE (t) == PTRMEM_CST)
7121     {
7122       tree delta;
7123       tree pfn;
7124
7125       expand_ptrmemfunc_cst (t, &delta, &pfn);
7126       if (pfn)
7127         return pfn;
7128     }
7129
7130   return build_ptrmemfunc_access_expr (t, pfn_identifier);
7131 }
7132
7133 /* Return an expression for DELTA from the pointer-to-member function
7134    given by T.  */
7135
7136 static tree
7137 delta_from_ptrmemfunc (tree t)
7138 {
7139   if (TREE_CODE (t) == PTRMEM_CST)
7140     {
7141       tree delta;
7142       tree pfn;
7143
7144       expand_ptrmemfunc_cst (t, &delta, &pfn);
7145       if (delta)
7146         return delta;
7147     }
7148
7149   return build_ptrmemfunc_access_expr (t, delta_identifier);
7150 }
7151
7152 /* Convert value RHS to type TYPE as preparation for an assignment to
7153    an lvalue of type TYPE.  ERRTYPE is a string to use in error
7154    messages: "assignment", "return", etc.  If FNDECL is non-NULL, we
7155    are doing the conversion in order to pass the PARMNUMth argument of
7156    FNDECL.  */
7157
7158 static tree
7159 convert_for_assignment (tree type, tree rhs,
7160                         const char *errtype, tree fndecl, int parmnum,
7161                         tsubst_flags_t complain, int flags)
7162 {
7163   tree rhstype;
7164   enum tree_code coder;
7165
7166   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
7167   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
7168     rhs = TREE_OPERAND (rhs, 0);
7169
7170   rhstype = TREE_TYPE (rhs);
7171   coder = TREE_CODE (rhstype);
7172
7173   if (TREE_CODE (type) == VECTOR_TYPE && coder == VECTOR_TYPE
7174       && vector_types_convertible_p (type, rhstype, true))
7175     return convert (type, rhs);
7176
7177   if (rhs == error_mark_node || rhstype == error_mark_node)
7178     return error_mark_node;
7179   if (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node)
7180     return error_mark_node;
7181
7182   /* The RHS of an assignment cannot have void type.  */
7183   if (coder == VOID_TYPE)
7184     {
7185       if (complain & tf_error)
7186         error ("void value not ignored as it ought to be");
7187       return error_mark_node;
7188     }
7189
7190   /* Simplify the RHS if possible.  */
7191   if (TREE_CODE (rhs) == CONST_DECL)
7192     rhs = DECL_INITIAL (rhs);
7193
7194   if (c_dialect_objc ())
7195     {
7196       int parmno;
7197       tree rname = fndecl;
7198
7199       if (!strcmp (errtype, "assignment"))
7200         parmno = -1;
7201       else if (!strcmp (errtype, "initialization"))
7202         parmno = -2;
7203       else
7204         {
7205           tree selector = objc_message_selector ();
7206
7207           parmno = parmnum;
7208
7209           if (selector && parmno > 1)
7210             {
7211               rname = selector;
7212               parmno -= 1;
7213             }
7214         }
7215
7216       if (objc_compare_types (type, rhstype, parmno, rname))
7217         return convert (type, rhs);
7218     }
7219
7220   /* [expr.ass]
7221
7222      The expression is implicitly converted (clause _conv_) to the
7223      cv-unqualified type of the left operand.
7224
7225      We allow bad conversions here because by the time we get to this point
7226      we are committed to doing the conversion.  If we end up doing a bad
7227      conversion, convert_like will complain.  */
7228   if (!can_convert_arg_bad (type, rhstype, rhs, flags))
7229     {
7230       /* When -Wno-pmf-conversions is use, we just silently allow
7231          conversions from pointers-to-members to plain pointers.  If
7232          the conversion doesn't work, cp_convert will complain.  */
7233       if (!warn_pmf2ptr
7234           && TYPE_PTR_P (type)
7235           && TYPE_PTRMEMFUNC_P (rhstype))
7236         rhs = cp_convert (strip_top_quals (type), rhs);
7237       else
7238         {
7239           if (complain & tf_error)
7240             {
7241               /* If the right-hand side has unknown type, then it is an
7242                  overloaded function.  Call instantiate_type to get error
7243                  messages.  */
7244               if (rhstype == unknown_type_node)
7245                 instantiate_type (type, rhs, tf_warning_or_error);
7246               else if (fndecl)
7247                 error ("cannot convert %qT to %qT for argument %qP to %qD",
7248                        rhstype, type, parmnum, fndecl);
7249               else
7250                 error ("cannot convert %qT to %qT in %s", rhstype, type,
7251                        errtype);
7252             }
7253           return error_mark_node;
7254         }
7255     }
7256   if (warn_missing_format_attribute)
7257     {
7258       const enum tree_code codel = TREE_CODE (type);
7259       if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
7260           && coder == codel
7261           && check_missing_format_attribute (type, rhstype)
7262           && (complain & tf_warning))
7263         warning (OPT_Wmissing_format_attribute,
7264                  "%s might be a candidate for a format attribute",
7265                  errtype);
7266     }
7267
7268   /* If -Wparentheses, warn about a = b = c when a has type bool and b
7269      does not.  */
7270   if (warn_parentheses
7271       && TREE_CODE (type) == BOOLEAN_TYPE
7272       && TREE_CODE (rhs) == MODIFY_EXPR
7273       && !TREE_NO_WARNING (rhs)
7274       && TREE_CODE (TREE_TYPE (rhs)) != BOOLEAN_TYPE
7275       && (complain & tf_warning))
7276     {
7277       location_t loc = EXPR_HAS_LOCATION (rhs) 
7278         ? EXPR_LOCATION (rhs) : input_location;
7279
7280       warning_at (loc, OPT_Wparentheses,
7281                   "suggest parentheses around assignment used as truth value");
7282       TREE_NO_WARNING (rhs) = 1;
7283     }
7284
7285   return perform_implicit_conversion_flags (strip_top_quals (type), rhs,
7286                                             complain, flags);
7287 }
7288
7289 /* Convert RHS to be of type TYPE.
7290    If EXP is nonzero, it is the target of the initialization.
7291    ERRTYPE is a string to use in error messages.
7292
7293    Two major differences between the behavior of
7294    `convert_for_assignment' and `convert_for_initialization'
7295    are that references are bashed in the former, while
7296    copied in the latter, and aggregates are assigned in
7297    the former (operator=) while initialized in the
7298    latter (X(X&)).
7299
7300    If using constructor make sure no conversion operator exists, if one does
7301    exist, an ambiguity exists.
7302
7303    If flags doesn't include LOOKUP_COMPLAIN, don't complain about anything.  */
7304
7305 tree
7306 convert_for_initialization (tree exp, tree type, tree rhs, int flags,
7307                             const char *errtype, tree fndecl, int parmnum,
7308                             tsubst_flags_t complain)
7309 {
7310   enum tree_code codel = TREE_CODE (type);
7311   tree rhstype;
7312   enum tree_code coder;
7313
7314   /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
7315      Strip such NOP_EXPRs, since RHS is used in non-lvalue context.  */
7316   if (TREE_CODE (rhs) == NOP_EXPR
7317       && TREE_TYPE (rhs) == TREE_TYPE (TREE_OPERAND (rhs, 0))
7318       && codel != REFERENCE_TYPE)
7319     rhs = TREE_OPERAND (rhs, 0);
7320
7321   if (type == error_mark_node
7322       || rhs == error_mark_node
7323       || (TREE_CODE (rhs) == TREE_LIST && TREE_VALUE (rhs) == error_mark_node))
7324     return error_mark_node;
7325
7326   if ((TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
7327        && TREE_CODE (type) != ARRAY_TYPE
7328        && (TREE_CODE (type) != REFERENCE_TYPE
7329            || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
7330       || (TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE
7331           && (TREE_CODE (type) != REFERENCE_TYPE
7332               || TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE))
7333       || TREE_CODE (TREE_TYPE (rhs)) == METHOD_TYPE)
7334     rhs = decay_conversion (rhs);
7335
7336   rhstype = TREE_TYPE (rhs);
7337   coder = TREE_CODE (rhstype);
7338
7339   if (coder == ERROR_MARK)
7340     return error_mark_node;
7341
7342   /* We accept references to incomplete types, so we can
7343      return here before checking if RHS is of complete type.  */
7344
7345   if (codel == REFERENCE_TYPE)
7346     {
7347       /* This should eventually happen in convert_arguments.  */
7348       int savew = 0, savee = 0;
7349
7350       if (fndecl)
7351         savew = warningcount, savee = errorcount;
7352       rhs = initialize_reference (type, rhs, /*decl=*/NULL_TREE,
7353                                   /*cleanup=*/NULL, complain);
7354       if (fndecl)
7355         {
7356           if (warningcount > savew)
7357             warning (0, "in passing argument %P of %q+D", parmnum, fndecl);
7358           else if (errorcount > savee)
7359             error ("in passing argument %P of %q+D", parmnum, fndecl);
7360         }
7361       return rhs;
7362     }
7363
7364   if (exp != 0)
7365     exp = require_complete_type (exp);
7366   if (exp == error_mark_node)
7367     return error_mark_node;
7368
7369   rhstype = non_reference (rhstype);
7370
7371   type = complete_type (type);
7372
7373   if (DIRECT_INIT_EXPR_P (type, rhs))
7374     /* Don't try to do copy-initialization if we already have
7375        direct-initialization.  */
7376     return rhs;
7377
7378   if (MAYBE_CLASS_TYPE_P (type))
7379     return ocp_convert (type, rhs, CONV_IMPLICIT|CONV_FORCE_TEMP, flags);
7380
7381   return convert_for_assignment (type, rhs, errtype, fndecl, parmnum,
7382                                  complain, flags);
7383 }
7384 \f
7385 /* If RETVAL is the address of, or a reference to, a local variable or
7386    temporary give an appropriate warning.  */
7387
7388 static void
7389 maybe_warn_about_returning_address_of_local (tree retval)
7390 {
7391   tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
7392   tree whats_returned = retval;
7393
7394   for (;;)
7395     {
7396       if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
7397         whats_returned = TREE_OPERAND (whats_returned, 1);
7398       else if (CONVERT_EXPR_P (whats_returned)
7399                || TREE_CODE (whats_returned) == NON_LVALUE_EXPR)
7400         whats_returned = TREE_OPERAND (whats_returned, 0);
7401       else
7402         break;
7403     }
7404
7405   if (TREE_CODE (whats_returned) != ADDR_EXPR)
7406     return;
7407   whats_returned = TREE_OPERAND (whats_returned, 0);
7408
7409   if (TREE_CODE (valtype) == REFERENCE_TYPE)
7410     {
7411       if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
7412           || TREE_CODE (whats_returned) == TARGET_EXPR)
7413         {
7414           warning (0, "returning reference to temporary");
7415           return;
7416         }
7417       if (TREE_CODE (whats_returned) == VAR_DECL
7418           && DECL_NAME (whats_returned)
7419           && TEMP_NAME_P (DECL_NAME (whats_returned)))
7420         {
7421           warning (0, "reference to non-lvalue returned");
7422           return;
7423         }
7424     }
7425
7426   while (TREE_CODE (whats_returned) == COMPONENT_REF
7427          || TREE_CODE (whats_returned) == ARRAY_REF)
7428     whats_returned = TREE_OPERAND (whats_returned, 0);
7429
7430   if (DECL_P (whats_returned)
7431       && DECL_NAME (whats_returned)
7432       && DECL_FUNCTION_SCOPE_P (whats_returned)
7433       && !(TREE_STATIC (whats_returned)
7434            || TREE_PUBLIC (whats_returned)))
7435     {
7436       if (TREE_CODE (valtype) == REFERENCE_TYPE)
7437         warning (0, "reference to local variable %q+D returned",
7438                  whats_returned);
7439       else
7440         warning (0, "address of local variable %q+D returned",
7441                  whats_returned);
7442       return;
7443     }
7444 }
7445
7446 /* Check that returning RETVAL from the current function is valid.
7447    Return an expression explicitly showing all conversions required to
7448    change RETVAL into the function return type, and to assign it to
7449    the DECL_RESULT for the function.  Set *NO_WARNING to true if
7450    code reaches end of non-void function warning shouldn't be issued
7451    on this RETURN_EXPR.  */
7452
7453 tree
7454 check_return_expr (tree retval, bool *no_warning)
7455 {
7456   tree result;
7457   /* The type actually returned by the function, after any
7458      promotions.  */
7459   tree valtype;
7460   int fn_returns_value_p;
7461   bool named_return_value_okay_p;
7462
7463   *no_warning = false;
7464
7465   /* A `volatile' function is one that isn't supposed to return, ever.
7466      (This is a G++ extension, used to get better code for functions
7467      that call the `volatile' function.)  */
7468   if (TREE_THIS_VOLATILE (current_function_decl))
7469     warning (0, "function declared %<noreturn%> has a %<return%> statement");
7470
7471   /* Check for various simple errors.  */
7472   if (DECL_DESTRUCTOR_P (current_function_decl))
7473     {
7474       if (retval)
7475         error ("returning a value from a destructor");
7476       return NULL_TREE;
7477     }
7478   else if (DECL_CONSTRUCTOR_P (current_function_decl))
7479     {
7480       if (in_function_try_handler)
7481         /* If a return statement appears in a handler of the
7482            function-try-block of a constructor, the program is ill-formed.  */
7483         error ("cannot return from a handler of a function-try-block of a constructor");
7484       else if (retval)
7485         /* You can't return a value from a constructor.  */
7486         error ("returning a value from a constructor");
7487       return NULL_TREE;
7488     }
7489
7490   /* As an extension, deduce lambda return type from a return statement
7491      anywhere in the body.  */
7492   if (retval && LAMBDA_FUNCTION_P (current_function_decl))
7493     {
7494       tree lambda = CLASSTYPE_LAMBDA_EXPR (current_class_type);
7495       if (LAMBDA_EXPR_DEDUCE_RETURN_TYPE_P (lambda))
7496         {
7497           tree type = lambda_return_type (retval);
7498           tree oldtype = LAMBDA_EXPR_RETURN_TYPE (lambda);
7499
7500           if (VOID_TYPE_P (type))
7501             { /* Nothing.  */ }
7502           else if (oldtype == NULL_TREE)
7503             {
7504               pedwarn (input_location, OPT_pedantic, "lambda return type "
7505                        "can only be deduced when the return statement is "
7506                        "the only statement in the function body");
7507               apply_lambda_return_type (lambda, type);
7508             }
7509           else if (!same_type_p (type, oldtype))
7510             error ("inconsistent types %qT and %qT deduced for "
7511                    "lambda return type", type, oldtype);
7512         }
7513     }
7514
7515   if (processing_template_decl)
7516     {
7517       current_function_returns_value = 1;
7518       if (check_for_bare_parameter_packs (retval))
7519         retval = error_mark_node;
7520       return retval;
7521     }
7522
7523   /* When no explicit return-value is given in a function with a named
7524      return value, the named return value is used.  */
7525   result = DECL_RESULT (current_function_decl);
7526   valtype = TREE_TYPE (result);
7527   gcc_assert (valtype != NULL_TREE);
7528   fn_returns_value_p = !VOID_TYPE_P (valtype);
7529   if (!retval && DECL_NAME (result) && fn_returns_value_p)
7530     retval = result;
7531
7532   /* Check for a return statement with no return value in a function
7533      that's supposed to return a value.  */
7534   if (!retval && fn_returns_value_p)
7535     {
7536       permerror (input_location, "return-statement with no value, in function returning %qT",
7537                  valtype);
7538       /* Clear this, so finish_function won't say that we reach the
7539          end of a non-void function (which we don't, we gave a
7540          return!).  */
7541       current_function_returns_null = 0;
7542       /* And signal caller that TREE_NO_WARNING should be set on the
7543          RETURN_EXPR to avoid control reaches end of non-void function
7544          warnings in tree-cfg.c.  */
7545       *no_warning = true;
7546     }
7547   /* Check for a return statement with a value in a function that
7548      isn't supposed to return a value.  */
7549   else if (retval && !fn_returns_value_p)
7550     {
7551       if (VOID_TYPE_P (TREE_TYPE (retval)))
7552         /* You can return a `void' value from a function of `void'
7553            type.  In that case, we have to evaluate the expression for
7554            its side-effects.  */
7555           finish_expr_stmt (retval);
7556       else
7557         permerror (input_location, "return-statement with a value, in function "
7558                    "returning 'void'");
7559       current_function_returns_null = 1;
7560
7561       /* There's really no value to return, after all.  */
7562       return NULL_TREE;
7563     }
7564   else if (!retval)
7565     /* Remember that this function can sometimes return without a
7566        value.  */
7567     current_function_returns_null = 1;
7568   else
7569     /* Remember that this function did return a value.  */
7570     current_function_returns_value = 1;
7571
7572   /* Check for erroneous operands -- but after giving ourselves a
7573      chance to provide an error about returning a value from a void
7574      function.  */
7575   if (error_operand_p (retval))
7576     {
7577       current_function_return_value = error_mark_node;
7578       return error_mark_node;
7579     }
7580
7581   /* Only operator new(...) throw(), can return NULL [expr.new/13].  */
7582   if ((DECL_OVERLOADED_OPERATOR_P (current_function_decl) == NEW_EXPR
7583        || DECL_OVERLOADED_OPERATOR_P (current_function_decl) == VEC_NEW_EXPR)
7584       && !TYPE_NOTHROW_P (TREE_TYPE (current_function_decl))
7585       && ! flag_check_new
7586       && retval && null_ptr_cst_p (retval))
7587     warning (0, "%<operator new%> must not return NULL unless it is "
7588              "declared %<throw()%> (or -fcheck-new is in effect)");
7589
7590   /* Effective C++ rule 15.  See also start_function.  */
7591   if (warn_ecpp
7592       && DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR))
7593     {
7594       bool warn = true;
7595
7596       /* The function return type must be a reference to the current
7597         class.  */
7598       if (TREE_CODE (valtype) == REFERENCE_TYPE
7599           && same_type_ignoring_top_level_qualifiers_p
7600               (TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
7601         {
7602           /* Returning '*this' is obviously OK.  */
7603           if (retval == current_class_ref)
7604             warn = false;
7605           /* If we are calling a function whose return type is the same of
7606              the current class reference, it is ok.  */
7607           else if (TREE_CODE (retval) == INDIRECT_REF
7608                    && TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
7609             warn = false;
7610         }
7611
7612       if (warn)
7613         warning (OPT_Weffc__, "%<operator=%> should return a reference to %<*this%>");
7614     }
7615
7616   /* The fabled Named Return Value optimization, as per [class.copy]/15:
7617
7618      [...]      For  a function with a class return type, if the expression
7619      in the return statement is the name of a local  object,  and  the  cv-
7620      unqualified  type  of  the  local  object  is the same as the function
7621      return type, an implementation is permitted to omit creating the  tem-
7622      porary  object  to  hold  the function return value [...]
7623
7624      So, if this is a value-returning function that always returns the same
7625      local variable, remember it.
7626
7627      It might be nice to be more flexible, and choose the first suitable
7628      variable even if the function sometimes returns something else, but
7629      then we run the risk of clobbering the variable we chose if the other
7630      returned expression uses the chosen variable somehow.  And people expect
7631      this restriction, anyway.  (jason 2000-11-19)
7632
7633      See finish_function and finalize_nrv for the rest of this optimization.  */
7634
7635   named_return_value_okay_p = 
7636     (retval != NULL_TREE
7637      /* Must be a local, automatic variable.  */
7638      && TREE_CODE (retval) == VAR_DECL
7639      && DECL_CONTEXT (retval) == current_function_decl
7640      && ! TREE_STATIC (retval)
7641      && ! DECL_ANON_UNION_VAR_P (retval)
7642      && (DECL_ALIGN (retval)
7643          >= DECL_ALIGN (DECL_RESULT (current_function_decl)))
7644      /* The cv-unqualified type of the returned value must be the
7645         same as the cv-unqualified return type of the
7646         function.  */
7647      && same_type_p ((TYPE_MAIN_VARIANT (TREE_TYPE (retval))),
7648                      (TYPE_MAIN_VARIANT
7649                       (TREE_TYPE (TREE_TYPE (current_function_decl)))))
7650      /* And the returned value must be non-volatile.  */
7651      && ! TYPE_VOLATILE (TREE_TYPE (retval)));
7652      
7653   if (fn_returns_value_p && flag_elide_constructors)
7654     {
7655       if (named_return_value_okay_p
7656           && (current_function_return_value == NULL_TREE
7657               || current_function_return_value == retval))
7658         current_function_return_value = retval;
7659       else
7660         current_function_return_value = error_mark_node;
7661     }
7662
7663   /* We don't need to do any conversions when there's nothing being
7664      returned.  */
7665   if (!retval)
7666     return NULL_TREE;
7667
7668   /* Do any required conversions.  */
7669   if (retval == result || DECL_CONSTRUCTOR_P (current_function_decl))
7670     /* No conversions are required.  */
7671     ;
7672   else
7673     {
7674       /* The type the function is declared to return.  */
7675       tree functype = TREE_TYPE (TREE_TYPE (current_function_decl));
7676       int flags = LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING;
7677
7678       /* The functype's return type will have been set to void, if it
7679          was an incomplete type.  Just treat this as 'return;' */
7680       if (VOID_TYPE_P (functype))
7681         return error_mark_node;
7682
7683       /* Under C++0x [12.8/16 class.copy], a returned lvalue is sometimes
7684          treated as an rvalue for the purposes of overload resolution to
7685          favor move constructors over copy constructors.  */
7686       if ((cxx_dialect != cxx98) 
7687           && named_return_value_okay_p
7688           /* The variable must not have the `volatile' qualifier.  */
7689           && !CP_TYPE_VOLATILE_P (TREE_TYPE (retval))
7690           /* The return type must be a class type.  */
7691           && CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl))))
7692         flags = flags | LOOKUP_PREFER_RVALUE;
7693
7694       /* First convert the value to the function's return type, then
7695          to the type of return value's location to handle the
7696          case that functype is smaller than the valtype.  */
7697       retval = convert_for_initialization
7698         (NULL_TREE, functype, retval, flags, "return", NULL_TREE, 0,
7699          tf_warning_or_error);
7700       retval = convert (valtype, retval);
7701
7702       /* If the conversion failed, treat this just like `return;'.  */
7703       if (retval == error_mark_node)
7704         return retval;
7705       /* We can't initialize a register from a AGGR_INIT_EXPR.  */
7706       else if (! cfun->returns_struct
7707                && TREE_CODE (retval) == TARGET_EXPR
7708                && TREE_CODE (TREE_OPERAND (retval, 1)) == AGGR_INIT_EXPR)
7709         retval = build2 (COMPOUND_EXPR, TREE_TYPE (retval), retval,
7710                          TREE_OPERAND (retval, 0));
7711       else
7712         maybe_warn_about_returning_address_of_local (retval);
7713     }
7714
7715   /* Actually copy the value returned into the appropriate location.  */
7716   if (retval && retval != result)
7717     retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
7718
7719   return retval;
7720 }
7721
7722 \f
7723 /* Returns nonzero if the pointer-type FROM can be converted to the
7724    pointer-type TO via a qualification conversion.  If CONSTP is -1,
7725    then we return nonzero if the pointers are similar, and the
7726    cv-qualification signature of FROM is a proper subset of that of TO.
7727
7728    If CONSTP is positive, then all outer pointers have been
7729    const-qualified.  */
7730
7731 static int
7732 comp_ptr_ttypes_real (tree to, tree from, int constp)
7733 {
7734   bool to_more_cv_qualified = false;
7735   bool is_opaque_pointer = false;
7736
7737   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7738     {
7739       if (TREE_CODE (to) != TREE_CODE (from))
7740         return 0;
7741
7742       if (TREE_CODE (from) == OFFSET_TYPE
7743           && !same_type_p (TYPE_OFFSET_BASETYPE (from),
7744                            TYPE_OFFSET_BASETYPE (to)))
7745         return 0;
7746
7747       /* Const and volatile mean something different for function types,
7748          so the usual checks are not appropriate.  */
7749       if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
7750         {
7751           /* In Objective-C++, some types may have been 'volatilized' by
7752              the compiler for EH; when comparing them here, the volatile
7753              qualification must be ignored.  */
7754           bool objc_quals_match = objc_type_quals_match (to, from);
7755
7756           if (!at_least_as_qualified_p (to, from) && !objc_quals_match)
7757             return 0;
7758
7759           if (!at_least_as_qualified_p (from, to) && !objc_quals_match)
7760             {
7761               if (constp == 0)
7762                 return 0;
7763               to_more_cv_qualified = true;
7764             }
7765
7766           if (constp > 0)
7767             constp &= TYPE_READONLY (to);
7768         }
7769
7770       if (TREE_CODE (to) == VECTOR_TYPE)
7771         is_opaque_pointer = vector_targets_convertible_p (to, from);
7772
7773       if (TREE_CODE (to) != POINTER_TYPE && !TYPE_PTRMEM_P (to))
7774         return ((constp >= 0 || to_more_cv_qualified)
7775                 && (is_opaque_pointer
7776                     || same_type_ignoring_top_level_qualifiers_p (to, from)));
7777     }
7778 }
7779
7780 /* When comparing, say, char ** to char const **, this function takes
7781    the 'char *' and 'char const *'.  Do not pass non-pointer/reference
7782    types to this function.  */
7783
7784 int
7785 comp_ptr_ttypes (tree to, tree from)
7786 {
7787   return comp_ptr_ttypes_real (to, from, 1);
7788 }
7789
7790 /* Returns true iff FNTYPE is a non-class type that involves
7791    error_mark_node.  We can get FUNCTION_TYPE with buried error_mark_node
7792    if a parameter type is ill-formed.  */
7793
7794 bool
7795 error_type_p (const_tree type)
7796 {
7797   tree t;
7798
7799   switch (TREE_CODE (type))
7800     {
7801     case ERROR_MARK:
7802       return true;
7803
7804     case POINTER_TYPE:
7805     case REFERENCE_TYPE:
7806     case OFFSET_TYPE:
7807       return error_type_p (TREE_TYPE (type));
7808
7809     case FUNCTION_TYPE:
7810     case METHOD_TYPE:
7811       if (error_type_p (TREE_TYPE (type)))
7812         return true;
7813       for (t = TYPE_ARG_TYPES (type); t; t = TREE_CHAIN (t))
7814         if (error_type_p (TREE_VALUE (t)))
7815           return true;
7816       return false;
7817
7818     case RECORD_TYPE:
7819       if (TYPE_PTRMEMFUNC_P (type))
7820         return error_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type));
7821       return false;
7822
7823     default:
7824       return false;
7825     }
7826 }
7827
7828 /* Returns 1 if to and from are (possibly multi-level) pointers to the same
7829    type or inheritance-related types, regardless of cv-quals.  */
7830
7831 int
7832 ptr_reasonably_similar (const_tree to, const_tree from)
7833 {
7834   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7835     {
7836       /* Any target type is similar enough to void.  */
7837       if (TREE_CODE (to) == VOID_TYPE)
7838         return !error_type_p (from);
7839       if (TREE_CODE (from) == VOID_TYPE)
7840         return !error_type_p (to);
7841
7842       if (TREE_CODE (to) != TREE_CODE (from))
7843         return 0;
7844
7845       if (TREE_CODE (from) == OFFSET_TYPE
7846           && comptypes (TYPE_OFFSET_BASETYPE (to),
7847                         TYPE_OFFSET_BASETYPE (from),
7848                         COMPARE_BASE | COMPARE_DERIVED))
7849         continue;
7850
7851       if (TREE_CODE (to) == VECTOR_TYPE
7852           && vector_types_convertible_p (to, from, false))
7853         return 1;
7854
7855       if (TREE_CODE (to) == INTEGER_TYPE
7856           && TYPE_PRECISION (to) == TYPE_PRECISION (from))
7857         return 1;
7858
7859       if (TREE_CODE (to) == FUNCTION_TYPE)
7860         return !error_type_p (to) && !error_type_p (from);
7861
7862       if (TREE_CODE (to) != POINTER_TYPE)
7863         return comptypes
7864           (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
7865            COMPARE_BASE | COMPARE_DERIVED);
7866     }
7867 }
7868
7869 /* Return true if TO and FROM (both of which are POINTER_TYPEs or
7870    pointer-to-member types) are the same, ignoring cv-qualification at
7871    all levels.  */
7872
7873 bool
7874 comp_ptr_ttypes_const (tree to, tree from)
7875 {
7876   bool is_opaque_pointer = false;
7877
7878   for (; ; to = TREE_TYPE (to), from = TREE_TYPE (from))
7879     {
7880       if (TREE_CODE (to) != TREE_CODE (from))
7881         return false;
7882
7883       if (TREE_CODE (from) == OFFSET_TYPE
7884           && same_type_p (TYPE_OFFSET_BASETYPE (from),
7885                           TYPE_OFFSET_BASETYPE (to)))
7886           continue;
7887
7888       if (TREE_CODE (to) == VECTOR_TYPE)
7889         is_opaque_pointer = vector_targets_convertible_p (to, from);
7890
7891       if (TREE_CODE (to) != POINTER_TYPE)
7892         return (is_opaque_pointer
7893                 || same_type_ignoring_top_level_qualifiers_p (to, from));
7894     }
7895 }
7896
7897 /* Returns the type qualifiers for this type, including the qualifiers on the
7898    elements for an array type.  */
7899
7900 int
7901 cp_type_quals (const_tree type)
7902 {
7903   int quals;
7904   /* This CONST_CAST is okay because strip_array_types returns its
7905      argument unmodified and we assign it to a const_tree.  */
7906   type = strip_array_types (CONST_CAST_TREE (type));
7907   if (type == error_mark_node
7908       /* Quals on a FUNCTION_TYPE are memfn quals.  */
7909       || TREE_CODE (type) == FUNCTION_TYPE)
7910     return TYPE_UNQUALIFIED;
7911   quals = TYPE_QUALS (type);
7912   /* METHOD and REFERENCE_TYPEs should never have quals.  */
7913   gcc_assert ((TREE_CODE (type) != METHOD_TYPE
7914                && TREE_CODE (type) != REFERENCE_TYPE)
7915               || ((quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE))
7916                   == TYPE_UNQUALIFIED));
7917   return quals;
7918 }
7919
7920 /* Returns the function-cv-quals for TYPE, which must be a FUNCTION_TYPE or
7921    METHOD_TYPE.  */
7922
7923 int
7924 type_memfn_quals (const_tree type)
7925 {
7926   if (TREE_CODE (type) == FUNCTION_TYPE)
7927     return TYPE_QUALS (type);
7928   else if (TREE_CODE (type) == METHOD_TYPE)
7929     return cp_type_quals (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (type))));
7930   else
7931     gcc_unreachable ();
7932 }
7933
7934 /* Returns the FUNCTION_TYPE TYPE with its function-cv-quals changed to
7935    MEMFN_QUALS.  */
7936
7937 tree
7938 apply_memfn_quals (tree type, cp_cv_quals memfn_quals)
7939 {
7940   /* Could handle METHOD_TYPE here if necessary.  */
7941   gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
7942   if (TYPE_QUALS (type) == memfn_quals)
7943     return type;
7944   /* This should really have a different TYPE_MAIN_VARIANT, but that gets
7945      complex.  */
7946   return build_qualified_type (type, memfn_quals);
7947 }
7948
7949 /* Returns nonzero if TYPE is const or volatile.  */
7950
7951 bool
7952 cv_qualified_p (const_tree type)
7953 {
7954   int quals = cp_type_quals (type);
7955   return (quals & (TYPE_QUAL_CONST|TYPE_QUAL_VOLATILE)) != 0;
7956 }
7957
7958 /* Returns nonzero if the TYPE contains a mutable member.  */
7959
7960 bool
7961 cp_has_mutable_p (const_tree type)
7962 {
7963   /* This CONST_CAST is okay because strip_array_types returns its
7964      argument unmodified and we assign it to a const_tree.  */
7965   type = strip_array_types (CONST_CAST_TREE(type));
7966
7967   return CLASS_TYPE_P (type) && CLASSTYPE_HAS_MUTABLE (type);
7968 }
7969
7970 /* Set TREE_READONLY and TREE_VOLATILE on DECL as indicated by the
7971    TYPE_QUALS.  For a VAR_DECL, this may be an optimistic
7972    approximation.  In particular, consider:
7973
7974      int f();
7975      struct S { int i; };
7976      const S s = { f(); }
7977
7978    Here, we will make "s" as TREE_READONLY (because it is declared
7979    "const") -- only to reverse ourselves upon seeing that the
7980    initializer is non-constant.  */
7981
7982 void
7983 cp_apply_type_quals_to_decl (int type_quals, tree decl)
7984 {
7985   tree type = TREE_TYPE (decl);
7986
7987   if (type == error_mark_node)
7988     return;
7989
7990   if (TREE_CODE (decl) == TYPE_DECL)
7991     return;
7992
7993   gcc_assert (!(TREE_CODE (type) == FUNCTION_TYPE
7994                 && type_quals != TYPE_UNQUALIFIED));
7995
7996   /* Avoid setting TREE_READONLY incorrectly.  */
7997   if (/* If the object has a constructor, the constructor may modify
7998          the object.  */
7999       TYPE_NEEDS_CONSTRUCTING (type)
8000       /* If the type isn't complete, we don't know yet if it will need
8001          constructing.  */
8002       || !COMPLETE_TYPE_P (type)
8003       /* If the type has a mutable component, that component might be
8004          modified.  */
8005       || TYPE_HAS_MUTABLE_P (type))
8006     type_quals &= ~TYPE_QUAL_CONST;
8007
8008   c_apply_type_quals_to_decl (type_quals, decl);
8009 }
8010
8011 /* Subroutine of casts_away_constness.  Make T1 and T2 point at
8012    exemplar types such that casting T1 to T2 is casting away constness
8013    if and only if there is no implicit conversion from T1 to T2.  */
8014
8015 static void
8016 casts_away_constness_r (tree *t1, tree *t2)
8017 {
8018   int quals1;
8019   int quals2;
8020
8021   /* [expr.const.cast]
8022
8023      For multi-level pointer to members and multi-level mixed pointers
8024      and pointers to members (conv.qual), the "member" aspect of a
8025      pointer to member level is ignored when determining if a const
8026      cv-qualifier has been cast away.  */
8027   /* [expr.const.cast]
8028
8029      For  two  pointer types:
8030
8031             X1 is T1cv1,1 * ... cv1,N *   where T1 is not a pointer type
8032             X2 is T2cv2,1 * ... cv2,M *   where T2 is not a pointer type
8033             K is min(N,M)
8034
8035      casting from X1 to X2 casts away constness if, for a non-pointer
8036      type T there does not exist an implicit conversion (clause
8037      _conv_) from:
8038
8039             Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
8040
8041      to
8042
8043             Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *.  */
8044   if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1))
8045       || (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2)))
8046     {
8047       *t1 = cp_build_qualified_type (void_type_node,
8048                                      cp_type_quals (*t1));
8049       *t2 = cp_build_qualified_type (void_type_node,
8050                                      cp_type_quals (*t2));
8051       return;
8052     }
8053
8054   quals1 = cp_type_quals (*t1);
8055   quals2 = cp_type_quals (*t2);
8056
8057   if (TYPE_PTRMEM_P (*t1))
8058     *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
8059   else
8060     *t1 = TREE_TYPE (*t1);
8061   if (TYPE_PTRMEM_P (*t2))
8062     *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
8063   else
8064     *t2 = TREE_TYPE (*t2);
8065
8066   casts_away_constness_r (t1, t2);
8067   *t1 = build_pointer_type (*t1);
8068   *t2 = build_pointer_type (*t2);
8069   *t1 = cp_build_qualified_type (*t1, quals1);
8070   *t2 = cp_build_qualified_type (*t2, quals2);
8071 }
8072
8073 /* Returns nonzero if casting from TYPE1 to TYPE2 casts away
8074    constness.  
8075
8076    ??? This function returns non-zero if casting away qualifiers not
8077    just const.  We would like to return to the caller exactly which
8078    qualifiers are casted away to give more accurate diagnostics.
8079 */
8080
8081 static bool
8082 casts_away_constness (tree t1, tree t2)
8083 {
8084   if (TREE_CODE (t2) == REFERENCE_TYPE)
8085     {
8086       /* [expr.const.cast]
8087
8088          Casting from an lvalue of type T1 to an lvalue of type T2
8089          using a reference cast casts away constness if a cast from an
8090          rvalue of type "pointer to T1" to the type "pointer to T2"
8091          casts away constness.  */
8092       t1 = (TREE_CODE (t1) == REFERENCE_TYPE ? TREE_TYPE (t1) : t1);
8093       return casts_away_constness (build_pointer_type (t1),
8094                                    build_pointer_type (TREE_TYPE (t2)));
8095     }
8096
8097   if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
8098     /* [expr.const.cast]
8099
8100        Casting from an rvalue of type "pointer to data member of X
8101        of type T1" to the type "pointer to data member of Y of type
8102        T2" casts away constness if a cast from an rvalue of type
8103        "pointer to T1" to the type "pointer to T2" casts away
8104        constness.  */
8105     return casts_away_constness
8106       (build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t1)),
8107        build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (t2)));
8108
8109   /* Casting away constness is only something that makes sense for
8110      pointer or reference types.  */
8111   if (TREE_CODE (t1) != POINTER_TYPE
8112       || TREE_CODE (t2) != POINTER_TYPE)
8113     return false;
8114
8115   /* Top-level qualifiers don't matter.  */
8116   t1 = TYPE_MAIN_VARIANT (t1);
8117   t2 = TYPE_MAIN_VARIANT (t2);
8118   casts_away_constness_r (&t1, &t2);
8119   if (!can_convert (t2, t1))
8120     return true;
8121
8122   return false;
8123 }
8124
8125 /* If T is a REFERENCE_TYPE return the type to which T refers.
8126    Otherwise, return T itself.  */
8127
8128 tree
8129 non_reference (tree t)
8130 {
8131   if (TREE_CODE (t) == REFERENCE_TYPE)
8132     t = TREE_TYPE (t);
8133   return t;
8134 }
8135
8136
8137 /* Return nonzero if REF is an lvalue valid for this language;
8138    otherwise, print an error message and return zero.  USE says
8139    how the lvalue is being used and so selects the error message.  */
8140
8141 int
8142 lvalue_or_else (tree ref, enum lvalue_use use, tsubst_flags_t complain)
8143 {
8144   int win = lvalue_p (ref);
8145
8146   if (!win && (complain & tf_error))
8147     lvalue_error (use);
8148
8149   return win;
8150 }
8151