1 /* Handle the hair of processing (but not expanding) inline functions.
2 Also manage function and variable name overloading.
3 Copyright (C) 1987, 1989, 1992, 1993 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
23 #ifndef PARM_CAN_BE_ARRAY_TYPE
24 #define PARM_CAN_BE_ARRAY_TYPE 1
27 /* Handle method declarations. */
38 #include "hard-reg-set.h"
41 /* TREE_LIST of the current inline functions that need to be
43 struct pending_inline *pending_inlines;
45 #define obstack_chunk_alloc xmalloc
46 #define obstack_chunk_free free
48 /* Obstack where we build text strings for overloading, etc. */
49 static struct obstack scratch_obstack;
50 static char *scratch_firstobj;
52 # define OB_INIT() (scratch_firstobj ? (obstack_free (&scratch_obstack, scratch_firstobj), 0) : 0)
53 # define OB_PUTC(C) (obstack_1grow (&scratch_obstack, (C)))
54 # define OB_PUTC2(C1,C2) \
55 (obstack_1grow (&scratch_obstack, (C1)), obstack_1grow (&scratch_obstack, (C2)))
56 # define OB_PUTS(S) (obstack_grow (&scratch_obstack, (S), sizeof (S) - 1))
57 # define OB_PUTID(ID) \
58 (obstack_grow (&scratch_obstack, IDENTIFIER_POINTER (ID), \
59 IDENTIFIER_LENGTH (ID)))
60 # define OB_PUTCP(S) (obstack_grow (&scratch_obstack, (S), strlen (S)))
61 # define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0'))
63 #ifdef NO_AUTO_OVERLOAD
70 gcc_obstack_init (&scratch_obstack);
71 scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0);
74 /* This must be large enough to hold any printed integer or floating-point
76 static char digit_buffer[128];
78 /* Move inline function definitions out of structure so that they
79 can be processed normally. CNAME is the name of the class
80 we are working from, METHOD_LIST is the list of method lists
81 of the structure. We delete friend methods here, after
82 saving away their inline function definitions (if any). */
85 do_inline_function_hair (type, friend_list)
86 tree type, friend_list;
88 tree method = TYPE_METHODS (type);
90 if (method && TREE_CODE (method) == TREE_VEC)
92 if (TREE_VEC_ELT (method, 0))
93 method = TREE_VEC_ELT (method, 0);
95 method = TREE_VEC_ELT (method, 1);
100 /* Do inline member functions. */
101 struct pending_inline *info = DECL_PENDING_INLINE_INFO (method);
106 my_friendly_assert (info->fndecl == method, 238);
107 args = DECL_ARGUMENTS (method);
110 DECL_CONTEXT (args) = method;
111 args = TREE_CHAIN (args);
114 /* Allow this decl to be seen in global scope. Don't do this for
115 local class methods, though. */
116 if (! current_function_decl)
117 IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (method)) = method;
119 method = TREE_CHAIN (method);
123 tree fndecl = TREE_VALUE (friend_list);
124 struct pending_inline *info = DECL_PENDING_INLINE_INFO (fndecl);
129 my_friendly_assert (info->fndecl == fndecl, 239);
130 args = DECL_ARGUMENTS (fndecl);
133 DECL_CONTEXT (args) = fndecl;
134 args = TREE_CHAIN (args);
137 /* Allow this decl to be seen in global scope */
138 if (! current_function_decl)
139 IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (fndecl)) = fndecl;
142 friend_list = TREE_CHAIN (friend_list);
146 /* Report an argument type mismatch between the best declared function
147 we could find and the current argument list that we have. */
149 report_type_mismatch (cp, parmtypes, name_kind)
150 struct candidate *cp;
154 int i = cp->u.bad_arg;
161 my_friendly_assert (TREE_CODE (cp->function) == TEMPLATE_DECL, 240);
162 cp_error ("type unification failed for function template `%#D'",
167 if (TYPE_READONLY (TREE_TYPE (TREE_VALUE (parmtypes))))
168 cp_error ("call to const %s `%#D' with non-const object", name_kind,
171 cp_error ("call to non-const %s `%#D' with const object", name_kind,
175 cp_error ("too few arguments for %s `%#D'", name_kind, cp->function);
178 cp_error ("too many arguments for %s `%#D'", name_kind, cp->function);
181 if (TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE)
183 /* Happens when we have an ambiguous base class. */
184 my_friendly_assert (get_binfo (DECL_CLASS_CONTEXT (cp->function),
185 TREE_TYPE (TREE_TYPE (TREE_VALUE (parmtypes))), 1) == error_mark_node,
191 ttf = TYPE_ARG_TYPES (TREE_TYPE (cp->function));
196 ttf = TREE_CHAIN (ttf);
197 tta = TREE_CHAIN (tta);
201 OB_PUTS ("bad argument ");
202 sprintf (digit_buffer, "%d", cp->u.bad_arg
203 - (TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE)
205 OB_PUTCP (digit_buffer);
207 OB_PUTS (" for function `");
208 OB_PUTCP (decl_as_string (cp->function, 1));
209 OB_PUTS ("' (type was ");
211 /* Reset `i' so that type printing routines do the right thing. */
214 enum tree_code code = TREE_CODE (TREE_TYPE (TREE_VALUE (tta)));
215 if (code == ERROR_MARK)
216 OB_PUTS ("(failed type instantiation)");
219 i = (code == FUNCTION_TYPE || code == METHOD_TYPE);
220 OB_PUTCP (type_as_string (TREE_TYPE (TREE_VALUE (tta)), 1));
223 else OB_PUTS ("void");
227 tmp_firstobj = (char *)alloca (obstack_object_size (&scratch_obstack));
228 bcopy (obstack_base (&scratch_obstack), tmp_firstobj,
229 obstack_object_size (&scratch_obstack));
230 error (tmp_firstobj);
233 /* Here is where overload code starts. */
235 /* Array of types seen so far in top-level call to `build_overload_name'.
236 Allocated and deallocated by caller. */
237 static tree *typevec;
239 /* Number of types interned by `build_overload_name' so far. */
242 /* Number of occurrences of last type seen. */
245 /* Nonzero if we should not try folding parameter types. */
248 #define ALLOCATE_TYPEVEC(PARMTYPES) \
249 do { maxtype = 0, nrepeats = 0; \
250 typevec = (tree *)alloca (list_length (PARMTYPES) * sizeof (tree)); } while (0)
252 #define DEALLOCATE_TYPEVEC(PARMTYPES) \
253 do { tree t = (PARMTYPES); \
254 while (t) { TREE_USED (TREE_VALUE (t)) = 0; t = TREE_CHAIN (t); } \
257 /* Code to concatenate an asciified integer to a string. */
266 /* Handle this case first, to go really quickly. For many common values,
267 the result of i/10 below is 1. */
284 OB_PUTC ('0' + (i % 10));
298 while (typevec[tindex] != type)
316 static int numeric_outputed_need_bar = 0;
317 static void build_overload_identifier ();
320 build_overload_nested_name (context)
323 /* We use DECL_NAME here, because pushtag now sets the DECL_ASSEMBLER_NAME. */
324 tree name = DECL_NAME (context);
325 if (DECL_CONTEXT (context))
327 context = DECL_CONTEXT (context);
328 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
329 context = TYPE_NAME (context);
330 build_overload_nested_name (context);
332 build_overload_identifier (name);
336 build_overload_value (type, value)
339 while (TREE_CODE (value) == NON_LVALUE_EXPR
340 || TREE_CODE (value) == NOP_EXPR)
341 value = TREE_OPERAND (value, 0);
342 my_friendly_assert (TREE_CODE (type) == PARM_DECL, 242);
343 type = TREE_TYPE (type);
344 switch (TREE_CODE (type))
349 my_friendly_assert (TREE_CODE (value) == INTEGER_CST, 243);
350 if (TYPE_PRECISION (value) == 2 * HOST_BITS_PER_WIDE_INT)
352 if (tree_int_cst_lt (value, integer_zero_node))
355 value = build_int_2 (~ TREE_INT_CST_LOW (value),
356 - TREE_INT_CST_HIGH (value));
358 if (TREE_INT_CST_HIGH (value)
359 != (TREE_INT_CST_LOW (value) >> (HOST_BITS_PER_WIDE_INT - 1)))
361 /* need to print a DImode value in decimal */
362 sorry ("conversion of long long as PT parameter");
364 /* else fall through to print in smaller mode */
366 /* Wordsize or smaller */
367 icat (TREE_INT_CST_LOW (value));
372 icat (TREE_INT_CST_LOW (value));
375 #ifndef REAL_IS_NOT_DOUBLE
379 char *bufp = digit_buffer;
380 extern char *index ();
382 my_friendly_assert (TREE_CODE (value) == REAL_CST, 244);
383 val = TREE_REAL_CST (value);
389 sprintf (bufp, "%e", val);
390 bufp = (char *) index (bufp, 'e');
392 strcat (digit_buffer, "e0");
418 OB_PUTCP (digit_buffer);
423 value = TREE_OPERAND (value, 0);
424 if (TREE_CODE (value) == VAR_DECL)
426 my_friendly_assert (DECL_NAME (value) != 0, 245);
427 build_overload_identifier (DECL_NAME (value));
430 else if (TREE_CODE (value) == FUNCTION_DECL)
432 my_friendly_assert (DECL_NAME (value) != 0, 246);
433 build_overload_identifier (DECL_NAME (value));
437 my_friendly_abort (71);
438 break; /* not really needed */
441 sorry ("conversion of %s as template parameter",
442 tree_code_name [(int) TREE_CODE (type)]);
443 my_friendly_abort (72);
448 build_overload_identifier (name)
451 if (IDENTIFIER_TEMPLATE (name))
453 tree template, parmlist, arglist, tname;
455 template = IDENTIFIER_TEMPLATE (name);
456 arglist = TREE_VALUE (template);
457 template = TREE_PURPOSE (template);
458 tname = DECL_NAME (template);
459 parmlist = DECL_ARGUMENTS (template);
460 nparms = TREE_VEC_LENGTH (parmlist);
462 icat (IDENTIFIER_LENGTH (tname));
465 for (i = 0; i < nparms; i++)
467 tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i));
468 tree arg = TREE_VEC_ELT (arglist, i);
469 if (TREE_CODE (parm) == TYPE_DECL)
471 /* This parameter is a type. */
473 build_overload_name (arg, 0, 0);
477 /* It's a PARM_DECL. */
478 build_overload_name (TREE_TYPE (parm), 0, 0);
479 build_overload_value (parm, arg);
480 numeric_outputed_need_bar = 1;
486 if (numeric_outputed_need_bar)
489 numeric_outputed_need_bar = 0;
491 icat (IDENTIFIER_LENGTH (name));
496 /* Given a list of parameters in PARMTYPES, create an unambiguous
497 overload string. Should distinguish any type that C (or C++) can
498 distinguish. I.e., pointers to functions are treated correctly.
500 Caller must deal with whether a final `e' goes on the end or not.
502 Any default conversions must take place before this function
505 BEGIN and END control initialization and finalization of the
506 obstack where we build the string. */
509 build_overload_name (parmtypes, begin, end)
516 if (begin) OB_INIT ();
518 if ((just_one = (TREE_CODE (parmtypes) != TREE_LIST)))
520 parmtype = parmtypes;
526 parmtype = TREE_VALUE (parmtypes);
533 /* Every argument gets counted. */
534 typevec[maxtype++] = parmtype;
536 if (TREE_USED (parmtype))
538 if (! just_one && parmtype == typevec[maxtype-2])
543 flush_repeats (parmtype);
544 if (! just_one && TREE_CHAIN (parmtypes)
545 && parmtype == TREE_VALUE (TREE_CHAIN (parmtypes)))
551 while (typevec[tindex] != parmtype)
562 flush_repeats (typevec[maxtype-2]);
564 /* Only cache types which take more than one character. */
565 && (parmtype != TYPE_MAIN_VARIANT (parmtype)
566 || (TREE_CODE (parmtype) != INTEGER_TYPE
567 && TREE_CODE (parmtype) != REAL_TYPE)))
568 TREE_USED (parmtype) = 1;
571 if (TYPE_PTRMEMFUNC_P (parmtype))
572 parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype);
574 if (TREE_READONLY (parmtype))
576 if (TREE_CODE (parmtype) == INTEGER_TYPE
577 && TYPE_MAIN_VARIANT (parmtype) == unsigned_type (TYPE_MAIN_VARIANT (parmtype)))
579 if (TYPE_VOLATILE (parmtype))
582 switch (TREE_CODE (parmtype))
586 build_overload_name (TYPE_OFFSET_BASETYPE (parmtype), 0, 0);
588 build_overload_name (TREE_TYPE (parmtype), 0, 0);
596 #if PARM_CAN_BE_ARRAY_TYPE
601 if (TYPE_DOMAIN (parmtype) == NULL_TREE)
602 error ("pointer or reference to array of unknown bound in parm type");
605 length = array_type_nelts (parmtype);
606 if (TREE_CODE (length) == INTEGER_CST)
607 icat (TREE_INT_CST_LOW (length) + 1);
620 build_overload_name (TREE_TYPE (parmtype), 0, 0);
626 tree firstarg = TYPE_ARG_TYPES (parmtype);
627 /* Otherwise have to implement reentrant typevecs,
628 unmark and remark types, etc. */
629 int old_nofold = nofold;
633 flush_repeats (typevec[maxtype-1]);
635 /* @@ It may be possible to pass a function type in
636 which is not preceded by a 'P'. */
637 if (TREE_CODE (parmtype) == FUNCTION_TYPE)
640 if (firstarg == NULL_TREE)
642 else if (firstarg == void_list_node)
645 build_overload_name (firstarg, 0, 0);
649 int constp = TYPE_READONLY (TREE_TYPE (TREE_VALUE (firstarg)));
650 int volatilep = TYPE_VOLATILE (TREE_TYPE (TREE_VALUE (firstarg)));
652 firstarg = TREE_CHAIN (firstarg);
654 build_overload_name (TYPE_METHOD_BASETYPE (parmtype), 0, 0);
660 /* For cfront 2.0 compatibility. */
663 if (firstarg == NULL_TREE)
665 else if (firstarg == void_list_node)
668 build_overload_name (firstarg, 0, 0);
671 /* Separate args from return type. */
673 build_overload_name (TREE_TYPE (parmtype), 0, 0);
679 parmtype = TYPE_MAIN_VARIANT (parmtype);
680 if (parmtype == integer_type_node
681 || parmtype == unsigned_type_node)
683 else if (parmtype == long_integer_type_node
684 || parmtype == long_unsigned_type_node)
686 else if (parmtype == short_integer_type_node
687 || parmtype == short_unsigned_type_node)
689 else if (parmtype == signed_char_type_node)
694 else if (parmtype == char_type_node
695 || parmtype == unsigned_char_type_node)
697 else if (parmtype == wchar_type_node)
699 else if (parmtype == long_long_integer_type_node
700 || parmtype == long_long_unsigned_type_node)
703 /* it would seem there is no way to enter these in source code,
705 else if (parmtype == long_long_long_integer_type_node
706 || parmtype == long_long_long_unsigned_type_node)
710 my_friendly_abort (73);
718 parmtype = TYPE_MAIN_VARIANT (parmtype);
719 if (parmtype == long_double_type_node)
721 else if (parmtype == double_type_node)
723 else if (parmtype == float_type_node)
725 else my_friendly_abort (74);
732 extern tree void_list_node;
734 /* See if anybody is wasting memory. */
735 my_friendly_assert (parmtypes == void_list_node, 247);
737 /* This is the end of a parameter list. */
738 if (end) OB_FINISH ();
739 return (char *)obstack_base (&scratch_obstack);
744 case ERROR_MARK: /* not right, but nothing is anyway */
747 /* have to do these */
751 /* Make this type signature look incompatible
758 tree name = TYPE_NAME (parmtype);
761 if (TREE_CODE (name) == TYPE_DECL)
764 while (DECL_CONTEXT (context))
767 context = DECL_CONTEXT (context);
768 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
769 context = TYPE_NAME (context);
771 name = DECL_NAME (name);
773 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 248);
782 numeric_outputed_need_bar = 0;
783 build_overload_nested_name (TYPE_NAME (parmtype));
786 build_overload_identifier (name);
791 /* This will take some work. */
795 case TEMPLATE_TYPE_PARM:
796 case TEMPLATE_CONST_PARM:
797 case UNINSTANTIATED_P_TYPE:
798 /* We don't ever want this output, but it's inconvenient not to
799 be able to build the string. This should cause assembler
800 errors we'll notice. */
803 sprintf (digit_buffer, " *%d", n++);
804 OB_PUTCP (digit_buffer);
809 my_friendly_abort (75);
814 parmtypes = TREE_CHAIN (parmtypes);
819 flush_repeats (typevec[maxtype-1]);
821 /* To get here, parms must end with `...'. */
825 if (end) OB_FINISH ();
826 return (char *)obstack_base (&scratch_obstack);
830 build_static_name (basetype, name)
833 char *basename = build_overload_name (basetype, 1, 1);
834 char *buf = (char *) alloca (IDENTIFIER_LENGTH (name)
835 + sizeof (STATIC_NAME_FORMAT)
836 + strlen (basename));
837 sprintf (buf, STATIC_NAME_FORMAT, basename, IDENTIFIER_POINTER (name));
838 return get_identifier (buf);
841 /* Generate an identifier that encodes the (ANSI) exception TYPE. */
843 /* This should be part of `ansi_opname', or at least be defined by the std. */
844 #define EXCEPTION_NAME_PREFIX "__ex"
845 #define EXCEPTION_NAME_LENGTH 4
848 cplus_exception_name (type)
852 OB_PUTS (EXCEPTION_NAME_PREFIX);
853 return get_identifier (build_overload_name (type, 0, 1));
856 /* Change the name of a function definition so that it may be
857 overloaded. NAME is the name of the function to overload,
858 PARMS is the parameter list (which determines what name the
859 final function obtains).
861 FOR_METHOD is 1 if this overload is being performed
862 for a method, rather than a function type. It is 2 if
863 this overload is being performed for a constructor. */
865 build_decl_overload (dname, parms, for_method)
870 char *name = IDENTIFIER_POINTER (dname);
872 /* member operators new and delete look like methods at this point. */
873 if (! for_method && parms != NULL_TREE && TREE_CODE (parms) == TREE_LIST)
875 if (dname == ansi_opname[(int) DELETE_EXPR])
876 return get_identifier ("__builtin_delete");
877 else if (dname == ansi_opname[(int) VEC_DELETE_EXPR])
878 return get_identifier ("__builtin_vec_delete");
879 else if (TREE_CHAIN (parms) == void_list_node)
881 if (dname == ansi_opname[(int) NEW_EXPR])
882 return get_identifier ("__builtin_new");
883 else if (dname == ansi_opname[(int) VEC_NEW_EXPR])
884 return get_identifier ("__builtin_vec_new");
891 /* Otherwise, we can divine that this is a constructor,
892 and figure out its name without any extra encoding. */
898 /* We can get away without doing this. */
902 tree this_type = TREE_VALUE (parms);
904 if (TREE_CODE (this_type) == RECORD_TYPE) /* a signature pointer */
905 parms = temp_tree_cons (NULL_TREE, SIGNATURE_TYPE (this_type),
908 parms = temp_tree_cons (NULL_TREE, TREE_TYPE (this_type),
915 if (parms == NULL_TREE)
916 OB_PUTC2 ('e', '\0');
917 else if (parms == void_list_node)
918 OB_PUTC2 ('v', '\0');
921 ALLOCATE_TYPEVEC (parms);
925 build_overload_name (TREE_VALUE (parms), 0, 0);
927 typevec[maxtype++] = TREE_VALUE (parms);
928 TREE_USED (TREE_VALUE (parms)) = 1;
930 if (TREE_CHAIN (parms))
931 build_overload_name (TREE_CHAIN (parms), 0, 1);
933 OB_PUTC2 ('e', '\0');
936 build_overload_name (parms, 0, 1);
937 DEALLOCATE_TYPEVEC (parms);
940 tree n = get_identifier (obstack_base (&scratch_obstack));
941 if (IDENTIFIER_OPNAME_P (dname))
942 IDENTIFIER_OPNAME_P (n) = 1;
947 /* Build an overload name for the type expression TYPE. */
949 build_typename_overload (type)
955 OB_PUTID (ansi_opname[(int) TYPE_EXPR]);
957 build_overload_name (type, 0, 1);
958 id = get_identifier (obstack_base (&scratch_obstack));
959 IDENTIFIER_OPNAME_P (id) = 1;
961 IDENTIFIER_GLOBAL_VALUE (id) = TYPE_NAME (type);
963 TREE_TYPE (id) = type;
967 #ifndef NO_DOLLAR_IN_LABEL
968 #define T_DESC_FORMAT "TD$"
969 #define I_DESC_FORMAT "ID$"
970 #define M_DESC_FORMAT "MD$"
972 #if !defined(NO_DOT_IN_LABEL)
973 #define T_DESC_FORMAT "TD."
974 #define I_DESC_FORMAT "ID."
975 #define M_DESC_FORMAT "MD."
977 #define T_DESC_FORMAT "__t_desc_"
978 #define I_DESC_FORMAT "__i_desc_"
979 #define M_DESC_FORMAT "__m_desc_"
983 /* Build an overload name for the type expression TYPE. */
985 build_t_desc_overload (type)
989 OB_PUTS (T_DESC_FORMAT);
993 /* Use a different format if the type isn't defined yet. */
994 if (TYPE_SIZE (type) == NULL_TREE)
999 for (p = tname; *p; p++)
1005 /* If there's no change, we have an inappropriate T_DESC_FORMAT. */
1006 my_friendly_assert (changed != 0, 249);
1010 build_overload_name (type, 0, 1);
1011 return get_identifier (obstack_base (&scratch_obstack));
1014 /* Top-level interface to explicit overload requests. Allow NAME
1015 to be overloaded. Error if NAME is already declared for the current
1016 scope. Warning if function is redundantly overloaded. */
1019 declare_overloaded (name)
1022 #ifdef NO_AUTO_OVERLOAD
1023 if (is_overloaded (name))
1024 warning ("function `%s' already declared overloaded",
1025 IDENTIFIER_POINTER (name));
1026 else if (IDENTIFIER_GLOBAL_VALUE (name))
1027 error ("overloading function `%s' that is already defined",
1028 IDENTIFIER_POINTER (name));
1031 TREE_OVERLOADED (name) = 1;
1032 IDENTIFIER_GLOBAL_VALUE (name) = build_tree_list (name, NULL_TREE);
1033 TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)) = unknown_type_node;
1036 if (current_lang_name == lang_name_cplusplus)
1039 warning ("functions are implicitly overloaded in C++");
1041 else if (current_lang_name == lang_name_c)
1042 error ("overloading function `%s' cannot be done in C language context");
1044 my_friendly_abort (76);
1048 #ifdef NO_AUTO_OVERLOAD
1049 /* Check to see if NAME is overloaded. For first approximation,
1050 check to see if its TREE_OVERLOADED is set. This is used on
1051 IDENTIFIER nodes. */
1053 is_overloaded (name)
1057 return (TREE_OVERLOADED (name)
1058 && (! IDENTIFIER_CLASS_VALUE (name) || current_class_type == 0)
1059 && ! IDENTIFIER_LOCAL_VALUE (name));
1063 /* Given a tree_code CODE, and some arguments (at least one),
1064 attempt to use an overloaded operator on the arguments.
1066 For unary operators, only the first argument need be checked.
1067 For binary operators, both arguments may need to be checked.
1069 Member functions can convert class references to class pointers,
1070 for one-level deep indirection. More than that is not supported.
1071 Operators [](), ()(), and ->() must be member functions.
1073 We call function call building calls with LOOKUP_COMPLAIN if they
1074 are our only hope. This is true when we see a vanilla operator
1075 applied to something of aggregate type. If this fails, we are free
1076 to return `error_mark_node', because we will have reported the
1079 Operators NEW and DELETE overload in funny ways: operator new takes
1080 a single `size' parameter, and operator delete takes a pointer to the
1081 storage being deleted. When overloading these operators, success is
1082 assumed. If there is a failure, report an error message and return
1083 `error_mark_node'. */
1087 build_opfncall (code, flags, xarg1, xarg2, arg3)
1088 enum tree_code code;
1090 tree xarg1, xarg2, arg3;
1094 tree type1, type2, fnname;
1095 tree fields1 = 0, parms = 0;
1098 int binary_is_unary;
1100 if (xarg1 == error_mark_node)
1101 return error_mark_node;
1103 if (code == COND_EXPR)
1105 if (TREE_CODE (xarg2) == ERROR_MARK
1106 || TREE_CODE (arg3) == ERROR_MARK)
1107 return error_mark_node;
1109 if (code == COMPONENT_REF)
1110 if (TREE_CODE (TREE_TYPE (xarg1)) == POINTER_TYPE)
1113 /* First, see if we can work with the first argument */
1114 type1 = TREE_TYPE (xarg1);
1116 /* Some tree codes have length > 1, but we really only want to
1117 overload them if their first argument has a user defined type. */
1120 case PREINCREMENT_EXPR:
1121 case PREDECREMENT_EXPR:
1122 case POSTINCREMENT_EXPR:
1123 case POSTDECREMENT_EXPR:
1125 binary_is_unary = 1;
1129 /* ARRAY_REFs and CALL_EXPRs must overload successfully.
1130 If they do not, return error_mark_node instead of NULL_TREE. */
1132 if (xarg2 == error_mark_node)
1133 return error_mark_node;
1135 rval = error_mark_node;
1136 binary_is_unary = 0;
1143 tree args = tree_cons (NULL_TREE, xarg2, arg3);
1144 fnname = ansi_opname[(int) code];
1145 if (flags & LOOKUP_GLOBAL)
1146 return build_overload_call (fnname, args, flags & LOOKUP_COMPLAIN,
1147 (struct candidate *)0);
1149 rval = build_method_call
1150 (build_indirect_ref (build1 (NOP_EXPR, xarg1, error_mark_node),
1152 fnname, args, NULL_TREE, flags);
1153 if (rval == error_mark_node)
1154 /* User might declare fancy operator new, but invoke it
1155 like standard one. */
1158 TREE_TYPE (rval) = xarg1;
1159 TREE_CALLS_NEW (rval) = 1;
1164 case VEC_DELETE_EXPR:
1167 fnname = ansi_opname[(int) code];
1168 if (flags & LOOKUP_GLOBAL)
1169 return build_overload_call (fnname,
1170 build_tree_list (NULL_TREE, xarg1),
1171 flags & LOOKUP_COMPLAIN,
1172 (struct candidate *)0);
1174 rval = build_method_call
1175 (build_indirect_ref (build1 (NOP_EXPR, TREE_TYPE (xarg1),
1178 fnname, tree_cons (NULL_TREE, xarg1,
1179 build_tree_list (NULL_TREE, xarg2)),
1181 /* This happens when the user mis-declares `operator delete'.
1182 Should now be impossible. */
1183 my_friendly_assert (rval != error_mark_node, 250);
1184 TREE_TYPE (rval) = void_type_node;
1190 binary_is_unary = 0;
1191 try_second = tree_code_length [(int) code] == 2;
1192 if (try_second && xarg2 == error_mark_node)
1193 return error_mark_node;
1197 if (try_second && xarg2 == error_mark_node)
1198 return error_mark_node;
1200 /* What ever it was, we do not know how to deal with it. */
1201 if (type1 == NULL_TREE)
1204 if (TREE_CODE (type1) == OFFSET_TYPE)
1205 type1 = TREE_TYPE (type1);
1207 if (TREE_CODE (type1) == REFERENCE_TYPE)
1209 arg1 = convert_from_reference (xarg1);
1210 type1 = TREE_TYPE (arg1);
1217 if (!IS_AGGR_TYPE (type1) || TYPE_PTRMEMFUNC_P (type1))
1219 /* Try to fail. First, fail if unary */
1222 /* Second, see if second argument is non-aggregate. */
1223 type2 = TREE_TYPE (xarg2);
1224 if (TREE_CODE (type2) == OFFSET_TYPE)
1225 type2 = TREE_TYPE (type2);
1226 if (TREE_CODE (type2) == REFERENCE_TYPE)
1228 arg2 = convert_from_reference (xarg2);
1229 type2 = TREE_TYPE (arg2);
1236 if (!IS_AGGR_TYPE (type2))
1243 /* First arg may succeed; see whether second should. */
1244 type2 = TREE_TYPE (xarg2);
1245 if (TREE_CODE (type2) == OFFSET_TYPE)
1246 type2 = TREE_TYPE (type2);
1247 if (TREE_CODE (type2) == REFERENCE_TYPE)
1249 arg2 = convert_from_reference (xarg2);
1250 type2 = TREE_TYPE (arg2);
1257 if (! IS_AGGR_TYPE (type2))
1261 if (type1 == unknown_type_node
1262 || (try_second && TREE_TYPE (xarg2) == unknown_type_node))
1264 /* This will not be implemented in the foreseeable future. */
1268 if (code == MODIFY_EXPR)
1269 fnname = ansi_assopname[(int) TREE_CODE (arg3)];
1271 fnname = ansi_opname[(int) code];
1273 global_fn = lookup_name_nonclass (fnname);
1275 /* This is the last point where we will accept failure. This
1276 may be too eager if we wish an overloaded operator not to match,
1277 but would rather a normal operator be called on a type-converted
1280 if (IS_AGGR_TYPE (type1))
1282 fields1 = lookup_fnfields (TYPE_BINFO (type1), fnname, 0);
1283 /* ARM $13.4.7, prefix/postfix ++/--. */
1284 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1286 xarg2 = integer_zero_node;
1287 binary_is_unary = 0;
1292 int have_postfix = 0;
1294 /* Look for an `operator++ (int)'. If they didn't have
1295 one, then we fall back to the old way of doing things. */
1296 for (t = TREE_VALUE (fields1); t ; t = TREE_CHAIN (t))
1298 t2 = TYPE_ARG_TYPES (TREE_TYPE (t));
1299 if (TREE_CHAIN (t2) != NULL_TREE
1300 && TREE_VALUE (TREE_CHAIN (t2)) == integer_type_node)
1309 char *op = POSTINCREMENT_EXPR ? "++" : "--";
1311 /* There's probably a LOT of code in the world that
1312 relies upon this old behavior. So we'll only give this
1313 warning when we've been given -pedantic. A few
1314 releases after 2.4, we'll convert this to be a pedwarn
1315 or something else more appropriate. */
1317 warning ("no `operator%s (int)' declared for postfix `%s'",
1320 binary_is_unary = 1;
1326 if (fields1 == NULL_TREE && global_fn == NULL_TREE)
1329 /* If RVAL winds up being `error_mark_node', we will return
1330 that... There is no way that normal semantics of these
1331 operators will succeed. */
1333 /* This argument may be an uncommitted OFFSET_REF. This is
1334 the case for example when dealing with static class members
1335 which are referenced from their class name rather than
1336 from a class instance. */
1337 if (TREE_CODE (xarg1) == OFFSET_REF
1338 && TREE_CODE (TREE_OPERAND (xarg1, 1)) == VAR_DECL)
1339 xarg1 = TREE_OPERAND (xarg1, 1);
1340 if (try_second && xarg2 && TREE_CODE (xarg2) == OFFSET_REF
1341 && TREE_CODE (TREE_OPERAND (xarg2, 1)) == VAR_DECL)
1342 xarg2 = TREE_OPERAND (xarg2, 1);
1345 flags |= LOOKUP_GLOBAL;
1347 if (code == CALL_EXPR)
1349 /* This can only be a member function. */
1350 return build_method_call (xarg1, fnname, xarg2,
1351 NULL_TREE, LOOKUP_NORMAL);
1353 else if (tree_code_length[(int) code] == 1 || binary_is_unary)
1356 rval = build_method_call (xarg1, fnname, NULL_TREE, NULL_TREE, flags);
1358 else if (code == COND_EXPR)
1360 parms = tree_cons (0, xarg2, build_tree_list (NULL_TREE, arg3));
1361 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1363 else if (code == METHOD_CALL_EXPR)
1365 /* must be a member function. */
1366 parms = tree_cons (NULL_TREE, xarg2, arg3);
1367 return build_method_call (xarg1, fnname, parms, NULL_TREE,
1372 parms = build_tree_list (NULL_TREE, xarg2);
1373 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1377 parms = tree_cons (NULL_TREE, xarg1,
1378 build_tree_list (NULL_TREE, xarg2));
1379 rval = build_overload_call (fnname, parms, flags,
1380 (struct candidate *)0);
1386 /* This function takes an identifier, ID, and attempts to figure out what
1387 it means. There are a number of possible scenarios, presented in increasing
1390 1) not in a class's scope
1391 2) in class's scope, member name of the class's method
1392 3) in class's scope, but not a member name of the class
1393 4) in class's scope, member name of a class's variable
1395 NAME is $1 from the bison rule. It is an IDENTIFIER_NODE.
1396 VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1)
1397 yychar is the pending input character (suitably encoded :-).
1399 As a last ditch, try to look up the name as a label and return that
1402 Values which are declared as being of REFERENCE_TYPE are
1403 automatically dereferenced here (as a hack to make the
1404 compiler faster). */
1407 hack_identifier (value, name, yychar)
1413 if (TREE_CODE (value) == ERROR_MARK)
1415 if (current_class_name)
1417 tree fields = lookup_fnfields (TYPE_BINFO (current_class_type), name, 1);
1418 if (fields == error_mark_node)
1419 return error_mark_node;
1424 fndecl = TREE_VALUE (fields);
1425 my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251);
1426 if (DECL_CHAIN (fndecl) == NULL_TREE)
1428 warning ("methods cannot be converted to function pointers");
1433 error ("ambiguous request for method pointer `%s'",
1434 IDENTIFIER_POINTER (name));
1435 return error_mark_node;
1439 if (flag_labels_ok && IDENTIFIER_LABEL_VALUE (name))
1441 return IDENTIFIER_LABEL_VALUE (name);
1443 return error_mark_node;
1446 type = TREE_TYPE (value);
1447 if (TREE_CODE (value) == FIELD_DECL)
1449 if (current_class_decl == NULL_TREE)
1451 error ("request for member `%s' in static member function",
1452 IDENTIFIER_POINTER (DECL_NAME (value)));
1453 return error_mark_node;
1455 TREE_USED (current_class_decl) = 1;
1457 if (! ((TYPE_LANG_SPECIFIC (type)
1458 && TYPE_OVERLOADS_CALL_EXPR (type))
1459 || (TREE_CODE (type) == REFERENCE_TYPE
1460 && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
1461 && TYPE_OVERLOADS_CALL_EXPR (TREE_TYPE (type))))
1462 && TREE_CODE (type) != FUNCTION_TYPE
1463 && TREE_CODE (type) != METHOD_TYPE
1464 && !TYPE_PTRMEMFUNC_P (type)
1465 && (TREE_CODE (type) != POINTER_TYPE
1466 || (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE
1467 && TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE)))
1469 error ("component `%s' is not a method",
1470 IDENTIFIER_POINTER (name));
1471 return error_mark_node;
1473 /* Mark so that if we are in a constructor, and then find that
1474 this field was initialized by a base initializer,
1475 we can emit an error message. */
1476 TREE_USED (value) = 1;
1477 return build_component_ref (C_C_D, name, 0, 1);
1480 if (really_overloaded_fn (value))
1482 tree t = get_first_fn (value);
1485 assemble_external (t);
1490 else if (TREE_CODE (value) == TREE_LIST)
1493 while (t && TREE_CODE (t) == TREE_LIST)
1495 assemble_external (TREE_VALUE (t));
1502 assemble_external (value);
1503 TREE_USED (value) = 1;
1506 if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value))
1508 if (DECL_LANG_SPECIFIC (value)
1509 && DECL_CLASS_CONTEXT (value) != current_class_type)
1512 enum access_type access;
1513 register tree context
1514 = (TREE_CODE (value) == FUNCTION_DECL && DECL_VIRTUAL_P (value))
1515 ? DECL_CLASS_CONTEXT (value)
1516 : DECL_CONTEXT (value);
1518 get_base_distance (context, current_class_type, 0, &path);
1521 access = compute_access (path, value);
1522 if (access != access_public)
1524 if (TREE_CODE (value) == VAR_DECL)
1525 error ("static member `%s' is %s",
1526 IDENTIFIER_POINTER (name),
1527 TREE_PRIVATE (value) ? "private" :
1528 "from a private base class");
1530 error ("enum `%s' is from private base class",
1531 IDENTIFIER_POINTER (name));
1532 return error_mark_node;
1538 if (TREE_CODE (value) == TREE_LIST && TREE_NONLOCAL_FLAG (value))
1542 error ("request for member `%s' is ambiguous in multiple inheritance lattice",
1543 IDENTIFIER_POINTER (name));
1544 return error_mark_node;
1550 if (TREE_CODE (type) == REFERENCE_TYPE)
1552 my_friendly_assert (TREE_CODE (value) == VAR_DECL
1553 || TREE_CODE (value) == PARM_DECL
1554 || TREE_CODE (value) == RESULT_DECL, 252);
1555 if (DECL_REFERENCE_SLOT (value))
1556 return DECL_REFERENCE_SLOT (value);
1563 /* Given an object OF, and a type conversion operator COMPONENT
1564 build a call to the conversion operator, if a call is requested,
1565 or return the address (as a pointer to member function) if one is not.
1567 OF can be a TYPE_DECL or any kind of datum that would normally
1568 be passed to `build_component_ref'. It may also be NULL_TREE,
1569 in which case `current_class_type' and `current_class_decl'
1570 provide default values.
1572 BASETYPE_PATH, if non-null, is the path of basetypes
1573 to go through before we get the the instance of interest.
1575 PROTECT says whether we apply C++ scoping rules or not. */
1577 build_component_type_expr (of, component, basetype_path, protect)
1578 tree of, component, basetype_path;
1581 tree cname = NULL_TREE;
1584 int flags = protect ? LOOKUP_NORMAL : LOOKUP_COMPLAIN;
1587 my_friendly_assert (IS_AGGR_TYPE (TREE_TYPE (of)), 253);
1588 my_friendly_assert (TREE_CODE (component) == TYPE_EXPR, 254);
1590 tmp = TREE_OPERAND (component, 0);
1595 switch (TREE_CODE (tmp))
1599 TREE_OPERAND (last, 0) = TREE_OPERAND (tmp, 0);
1601 TREE_OPERAND (component, 0) = TREE_OPERAND (tmp, 0);
1603 last = groktypename (build_tree_list (TREE_TYPE (component),
1604 TREE_OPERAND (component, 0)));
1605 name = build_typename_overload (last);
1606 TREE_TYPE (name) = last;
1608 if (TREE_OPERAND (tmp, 0)
1609 && TREE_OPERAND (tmp, 0) != void_list_node)
1611 cp_error ("`operator %T' requires empty parameter list", last);
1612 TREE_OPERAND (tmp, 0) = NULL_TREE;
1615 if (of && TREE_CODE (of) != TYPE_DECL)
1616 return build_method_call (of, name, NULL_TREE, NULL_TREE, flags);
1621 if (current_class_decl == NULL_TREE)
1623 cp_error ("object required for `operator %T' call",
1625 return error_mark_node;
1628 this_this = convert_pointer_to (TREE_TYPE (of),
1629 current_class_decl);
1630 this_this = build_indirect_ref (this_this, NULL_PTR);
1631 return build_method_call (this_this, name, NULL_TREE,
1632 NULL_TREE, flags | LOOKUP_NONVIRTUAL);
1634 else if (current_class_decl)
1635 return build_method_call (tmp, name, NULL_TREE, NULL_TREE, flags);
1637 cp_error ("object required for `operator %T' call",
1639 return error_mark_node;
1647 my_friendly_assert (cname == 0, 255);
1648 cname = TREE_OPERAND (tmp, 0);
1649 tmp = TREE_OPERAND (tmp, 1);
1653 my_friendly_abort (77);
1656 tmp = TREE_OPERAND (tmp, 0);
1659 last = groktypename (build_tree_list (TREE_TYPE (component), TREE_OPERAND (component, 0)));
1660 name = build_typename_overload (last);
1661 TREE_TYPE (name) = last;
1662 if (of && TREE_CODE (of) == TYPE_DECL)
1664 if (cname == NULL_TREE)
1666 cname = DECL_NAME (of);
1669 else my_friendly_assert (cname == DECL_NAME (of), 256);
1676 if (current_class_decl == NULL_TREE)
1678 cp_error ("object required for `operator %T' call",
1680 return error_mark_node;
1683 this_this = convert_pointer_to (TREE_TYPE (of), current_class_decl);
1684 return build_component_ref (this_this, name, 0, protect);
1687 return build_offset_ref (cname, name);
1688 else if (current_class_name)
1689 return build_offset_ref (current_class_name, name);
1691 cp_error ("object required for `operator %T' member reference",
1693 return error_mark_node;
1698 thunk_printable_name (decl)
1701 return "<thunk function>";
1705 make_thunk (function, delta)
1710 tree thunk_fndecl, thunk_id;
1713 static int thunk_number = 0;
1715 if (TREE_CODE (function) != ADDR_EXPR)
1717 func_decl = TREE_OPERAND (function, 0);
1718 if (TREE_CODE (func_decl) != FUNCTION_DECL)
1720 func_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func_decl));
1721 sprintf (buffer, "__thunk_%d_%s", -delta, func_name);
1722 thunk_id = get_identifier (buffer);
1723 thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id);
1724 if (thunk && TREE_CODE (thunk) != THUNK_DECL)
1726 error_with_decl ("implementation-reserved name `%s' used");
1727 IDENTIFIER_GLOBAL_VALUE (thunk_id) = thunk = NULL_TREE;
1729 if (thunk == NULL_TREE)
1731 thunk = build_decl (THUNK_DECL, thunk_id, TREE_TYPE (func_decl));
1733 = build_decl (RESULT_DECL, NULL_TREE, TREE_TYPE (vtable_entry_type));
1734 make_function_rtl (thunk);
1735 DECL_INITIAL (thunk) = function;
1736 THUNK_DELTA (thunk) = delta;
1737 /* So that finish_file can write out any thunks that need to be: */
1738 pushdecl_top_level (thunk);
1744 emit_thunk (thunk_fndecl)
1751 struct args_size stack_args_size;
1752 tree function = TREE_OPERAND (DECL_INITIAL (thunk_fndecl), 0);
1753 int delta = THUNK_DELTA (thunk_fndecl);
1756 int current_call_is_indirect = 0; /* needed for HPPA FUNCTION_ARG */
1758 /* Used to remember which regs we need to emit a USE rtx for. */
1759 rtx need_use[FIRST_PSEUDO_REGISTER];
1760 int need_use_count = 0;
1762 /* rtx for the 'this' parameter. */
1763 rtx this_rtx = 0, this_reg_rtx = 0, fixed_this_rtx;
1765 char *(*save_decl_printable_name) () = decl_printable_name;
1766 /* Data on reg parms scanned so far. */
1767 CUMULATIVE_ARGS args_so_far;
1769 if (TREE_ASM_WRITTEN (thunk_fndecl))
1772 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
1774 if (TREE_PUBLIC (function))
1776 TREE_PUBLIC (thunk_fndecl) = 1;
1777 if (DECL_EXTERNAL (function))
1779 DECL_EXTERNAL (thunk_fndecl) = 1;
1780 assemble_external (thunk_fndecl);
1785 decl_printable_name = thunk_printable_name;
1786 if (current_function_decl)
1788 current_function_decl = thunk_fndecl;
1789 init_function_start (thunk_fndecl, input_filename, lineno);
1791 expand_start_bindings (1);
1793 /* Start updating where the next arg would go. */
1794 INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (function), NULL_RTX);
1795 stack_args_size.constant = 0;
1796 stack_args_size.var = 0;
1797 /* SETUP for possible structure return address FIXME */
1799 /* Now look through all the parameters, make sure that we
1800 don't clobber any registers used for parameters.
1801 Also, pick up an rtx for the first "this" parameter. */
1802 for (argp = TYPE_ARG_TYPES (TREE_TYPE (function));
1804 argp = TREE_CHAIN (argp))
1807 tree passed_type = TREE_VALUE (argp);
1808 register rtx entry_parm;
1809 int named = 1; /* FIXME */
1810 struct args_size stack_offset;
1811 struct args_size arg_size;
1813 if (passed_type == void_type_node)
1816 if ((TREE_CODE (TYPE_SIZE (passed_type)) != INTEGER_CST
1817 && contains_placeholder_p (TYPE_SIZE (passed_type)))
1818 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
1819 || FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far,
1820 TYPE_MODE (passed_type),
1824 passed_type = build_pointer_type (passed_type);
1826 entry_parm = FUNCTION_ARG (args_so_far,
1827 TYPE_MODE (passed_type),
1830 if (entry_parm != 0)
1831 need_use[need_use_count++] = entry_parm;
1833 locate_and_pad_parm (TYPE_MODE (passed_type), passed_type,
1834 #ifdef STACK_PARMS_IN_REG_PARM_AREA
1840 &stack_args_size, &stack_offset, &arg_size);
1842 /* REGNO (entry_parm);*/
1845 this_reg_rtx = entry_parm;
1848 rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
1850 rtx internal_arg_pointer, stack_parm;
1852 if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
1853 || ! (fixed_regs[ARG_POINTER_REGNUM]
1854 || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
1855 internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
1857 internal_arg_pointer = virtual_incoming_args_rtx;
1859 if (offset_rtx == const0_rtx)
1860 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1861 internal_arg_pointer);
1863 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1864 gen_rtx (PLUS, Pmode,
1865 internal_arg_pointer,
1869 this_rtx = entry_parm;
1872 FUNCTION_ARG_ADVANCE (args_so_far,
1873 TYPE_MODE (passed_type),
1878 fixed_this_rtx = plus_constant (this_rtx, delta);
1879 if (this_rtx != fixed_this_rtx)
1880 emit_move_insn (this_rtx, fixed_this_rtx);
1883 emit_insn (gen_rtx (USE, VOIDmode, this_reg_rtx));
1885 emit_indirect_jump (XEXP (DECL_RTL (function), 0));
1887 while (need_use_count > 0)
1888 emit_insn (gen_rtx (USE, VOIDmode, need_use[--need_use_count]));
1890 expand_end_bindings (NULL, 1, 0);
1893 /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
1894 Note that that may have been done above, in save_for_inline_copying.
1895 The call to resume_temporary_allocation near the end of this function
1896 goes back to the usual state of affairs. */
1898 rtl_in_current_obstack ();
1900 insns = get_insns ();
1902 /* Copy any shared structure that should not be shared. */
1904 unshare_all_rtl (insns);
1906 /* We are no longer anticipating cse in this function, at least. */
1908 cse_not_expected = 1;
1910 /* Now we choose between stupid (pcc-like) register allocation
1911 (if we got the -noreg switch and not -opt)
1912 and smart register allocation. */
1914 if (optimize > 0) /* Stupid allocation probably won't work */
1915 obey_regdecls = 0; /* if optimizations being done. */
1919 regclass (insns, max_reg_num ());
1922 stupid_life_analysis (insns, max_reg_num (), NULL);
1923 failure = reload (insns, 0, NULL);
1927 /* Do control and data flow analysis,
1928 and write some of the results to dump file. */
1930 flow_analysis (insns, max_reg_num (), NULL);
1932 failure = global_alloc (NULL);
1935 reload_completed = 1;
1937 #ifdef LEAF_REGISTERS
1939 if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
1943 /* If a machine dependent reorganization is needed, call it. */
1944 #ifdef MACHINE_DEPENDENT_REORG
1945 MACHINE_DEPENDENT_REORG (insns);
1948 /* Now turn the rtl into assembler code. */
1951 char *fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
1952 assemble_start_function (thunk_fndecl, fnname);
1953 final (insns, asm_out_file, optimize, 0);
1954 assemble_end_function (thunk_fndecl, fnname);
1957 exit_rest_of_compilation:
1959 reload_completed = 0;
1961 /* Cancel the effect of rtl_in_current_obstack. */
1963 resume_temporary_allocation ();
1965 decl_printable_name = save_decl_printable_name;
1966 current_function_decl = 0;
1969 /* Code for synthesizing methods which have default semantics defined. */
1972 build_default_constructor (fndecl)
1975 start_function (NULL_TREE, fndecl, NULL_TREE, 1);
1976 store_parm_decls ();
1978 finish_function (lineno, 0);
1981 /* Generate code for default X(X&) constructor. */
1983 build_copy_constructor (fndecl)
1986 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
1989 start_function (NULL_TREE, fndecl, NULL_TREE, 1);
1990 store_parm_decls ();
1994 if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
1995 parm = TREE_CHAIN (parm);
1996 parm = convert_from_reference (parm);
1998 if (! TYPE_HAS_COMPLEX_INIT_REF (current_class_type))
2000 t = build (INIT_EXPR, void_type_node, C_C_D, parm);
2001 TREE_SIDE_EFFECTS (t) = 1;
2002 cplus_expand_expr_stmt (t);
2006 tree fields = TYPE_FIELDS (current_class_type);
2007 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
2008 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
2011 for (t = CLASSTYPE_VBASECLASSES (current_class_type); t;
2014 tree basetype = BINFO_TYPE (t);
2015 tree p = convert (build_reference_type (basetype), parm);
2016 p = convert_from_reference (p);
2017 current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype),
2018 p, current_base_init_list);
2021 for (i = 0; i < n_bases; ++i)
2023 tree p, basetype = TREE_VEC_ELT (binfos, i);
2024 if (TREE_VIA_VIRTUAL (basetype))
2027 basetype = BINFO_TYPE (basetype);
2028 p = convert (build_reference_type (basetype), parm);
2029 p = convert_from_reference (p);
2030 current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype),
2031 p, current_base_init_list);
2033 for (; fields; fields = TREE_CHAIN (fields))
2036 if (TREE_CODE (fields) != FIELD_DECL)
2038 if (DECL_NAME (fields))
2040 if (VFIELD_NAME_P (DECL_NAME (fields)))
2042 if (VBASE_NAME_P (DECL_NAME (fields)))
2045 /* True for duplicate members. */
2046 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields)
2050 init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields);
2051 init = build_tree_list (NULL_TREE, init);
2053 current_member_init_list
2054 = tree_cons (DECL_NAME (fields), init, current_member_init_list);
2056 current_member_init_list = nreverse (current_member_init_list);
2061 finish_function (lineno, 0);
2065 build_assign_ref (fndecl)
2068 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
2070 start_function (NULL_TREE, fndecl, NULL_TREE, 1);
2071 store_parm_decls ();
2074 parm = convert_from_reference (parm);
2076 if (! TYPE_HAS_COMPLEX_ASSIGN_REF (current_class_type))
2078 tree t = build (MODIFY_EXPR, void_type_node, C_C_D, parm);
2079 TREE_SIDE_EFFECTS (t) = 1;
2080 cplus_expand_expr_stmt (t);
2084 tree fields = TYPE_FIELDS (current_class_type);
2085 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
2086 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
2089 for (i = 0; i < n_bases; ++i)
2091 tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
2092 if (TYPE_HAS_ASSIGN_REF (basetype))
2094 tree p = convert (build_reference_type (basetype), parm);
2095 p = convert_from_reference (p);
2096 p = build_member_call (TYPE_NESTED_NAME (basetype),
2097 ansi_opname [MODIFY_EXPR],
2098 build_tree_list (NULL_TREE, p));
2099 expand_expr_stmt (p);
2102 for (; fields; fields = TREE_CHAIN (fields))
2105 if (TREE_CODE (fields) != FIELD_DECL)
2107 if (DECL_NAME (fields))
2109 if (VFIELD_NAME_P (DECL_NAME (fields)))
2111 if (VBASE_NAME_P (DECL_NAME (fields)))
2114 /* True for duplicate members. */
2115 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields)
2119 comp = build (COMPONENT_REF, TREE_TYPE (fields), C_C_D, fields);
2120 init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields);
2122 expand_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
2125 c_expand_return (C_C_D);
2127 finish_function (lineno, 0);
2134 start_function (NULL_TREE, fndecl, NULL_TREE, 1);
2135 store_parm_decls ();
2136 finish_function (lineno, 0);