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, 1995 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, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
24 #ifndef PARM_CAN_BE_ARRAY_TYPE
25 #define PARM_CAN_BE_ARRAY_TYPE 1
28 /* Handle method declarations. */
39 #include "hard-reg-set.h"
42 /* TREE_LIST of the current inline functions that need to be
44 struct pending_inline *pending_inlines;
46 #define obstack_chunk_alloc xmalloc
47 #define obstack_chunk_free free
49 /* Obstack where we build text strings for overloading, etc. */
50 static struct obstack scratch_obstack;
51 static char *scratch_firstobj;
53 # define OB_INIT() (scratch_firstobj ? (obstack_free (&scratch_obstack, scratch_firstobj), 0) : 0)
54 # define OB_PUTC(C) (obstack_1grow (&scratch_obstack, (C)))
55 # define OB_PUTC2(C1,C2) \
56 (obstack_1grow (&scratch_obstack, (C1)), obstack_1grow (&scratch_obstack, (C2)))
57 # define OB_PUTS(S) (obstack_grow (&scratch_obstack, (S), sizeof (S) - 1))
58 # define OB_PUTID(ID) \
59 (obstack_grow (&scratch_obstack, IDENTIFIER_POINTER (ID), \
60 IDENTIFIER_LENGTH (ID)))
61 # define OB_PUTCP(S) (obstack_grow (&scratch_obstack, (S), strlen (S)))
62 # define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0'))
63 # define OB_LAST() (obstack_next_free (&scratch_obstack)[-1])
65 #ifdef NO_AUTO_OVERLOAD
72 gcc_obstack_init (&scratch_obstack);
73 scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0);
76 /* This must be large enough to hold any printed integer or floating-point
78 static char digit_buffer[128];
80 /* Move inline function definitions out of structure so that they
81 can be processed normally. CNAME is the name of the class
82 we are working from, METHOD_LIST is the list of method lists
83 of the structure. We delete friend methods here, after
84 saving away their inline function definitions (if any). */
87 do_inline_function_hair (type, friend_list)
88 tree type, friend_list;
90 tree method = TYPE_METHODS (type);
92 if (method && TREE_CODE (method) == TREE_VEC)
94 if (TREE_VEC_ELT (method, 0))
95 method = TREE_VEC_ELT (method, 0);
97 method = TREE_VEC_ELT (method, 1);
102 /* Do inline member functions. */
103 struct pending_inline *info = DECL_PENDING_INLINE_INFO (method);
108 my_friendly_assert (info->fndecl == method, 238);
109 args = DECL_ARGUMENTS (method);
112 DECL_CONTEXT (args) = method;
113 args = TREE_CHAIN (args);
116 /* Allow this decl to be seen in global scope. Don't do this for
117 local class methods, though. */
118 if (! current_function_decl)
119 IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (method)) = method;
121 method = TREE_CHAIN (method);
125 tree fndecl = TREE_VALUE (friend_list);
126 struct pending_inline *info = DECL_PENDING_INLINE_INFO (fndecl);
131 my_friendly_assert (info->fndecl == fndecl, 239);
132 args = DECL_ARGUMENTS (fndecl);
135 DECL_CONTEXT (args) = fndecl;
136 args = TREE_CHAIN (args);
139 /* Allow this decl to be seen in global scope */
140 if (! current_function_decl)
141 IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (fndecl)) = fndecl;
144 friend_list = TREE_CHAIN (friend_list);
148 /* Report an argument type mismatch between the best declared function
149 we could find and the current argument list that we have. */
151 report_type_mismatch (cp, parmtypes, name_kind)
152 struct candidate *cp;
156 int i = cp->u.bad_arg;
163 my_friendly_assert (TREE_CODE (cp->function) == TEMPLATE_DECL, 240);
164 cp_error ("type unification failed for function template `%#D'",
169 if (TYPE_READONLY (TREE_TYPE (TREE_VALUE (parmtypes))))
170 cp_error ("call to const %s `%#D' with non-const object", name_kind,
173 cp_error ("call to non-const %s `%#D' with const object", name_kind,
177 cp_error ("too few arguments for %s `%#D'", name_kind, cp->function);
180 cp_error ("too many arguments for %s `%#D'", name_kind, cp->function);
183 if (TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE)
185 /* Happens when we have an ambiguous base class. */
186 my_friendly_assert (get_binfo (DECL_CLASS_CONTEXT (cp->function),
187 TREE_TYPE (TREE_TYPE (TREE_VALUE (parmtypes))), 1) == error_mark_node,
193 ttf = TYPE_ARG_TYPES (TREE_TYPE (cp->function));
198 ttf = TREE_CHAIN (ttf);
199 tta = TREE_CHAIN (tta);
203 OB_PUTS ("bad argument ");
204 sprintf (digit_buffer, "%d", cp->u.bad_arg
205 - (TREE_CODE (TREE_TYPE (cp->function)) == METHOD_TYPE)
207 OB_PUTCP (digit_buffer);
209 OB_PUTS (" for function `");
210 OB_PUTCP (decl_as_string (cp->function, 1));
211 OB_PUTS ("' (type was ");
213 /* Reset `i' so that type printing routines do the right thing. */
216 enum tree_code code = TREE_CODE (TREE_TYPE (TREE_VALUE (tta)));
217 if (code == ERROR_MARK)
218 OB_PUTS ("(failed type instantiation)");
221 i = (code == FUNCTION_TYPE || code == METHOD_TYPE);
222 OB_PUTCP (type_as_string (TREE_TYPE (TREE_VALUE (tta)), 1));
225 else OB_PUTS ("void");
229 tmp_firstobj = (char *)alloca (obstack_object_size (&scratch_obstack));
230 bcopy (obstack_base (&scratch_obstack), tmp_firstobj,
231 obstack_object_size (&scratch_obstack));
232 error (tmp_firstobj);
235 /* Here is where overload code starts. */
237 /* Array of types seen so far in top-level call to `build_overload_name'.
238 Allocated and deallocated by caller. */
239 static tree *typevec;
241 /* Number of types interned by `build_overload_name' so far. */
244 /* Number of occurrences of last type seen. */
247 /* Nonzero if we should not try folding parameter types. */
250 #define ALLOCATE_TYPEVEC(PARMTYPES) \
251 do { maxtype = 0, nrepeats = 0; \
252 typevec = (tree *)alloca (list_length (PARMTYPES) * sizeof (tree)); } while (0)
254 #define DEALLOCATE_TYPEVEC(PARMTYPES) \
255 do { tree t = (PARMTYPES); \
256 while (t) { TREE_USED (TREE_VALUE (t)) = 0; t = TREE_CHAIN (t); } \
259 /* Code to concatenate an asciified integer to a string. */
268 /* Handle this case first, to go really quickly. For many common values,
269 the result of i/10 below is 1. */
286 OB_PUTC ('0' + (i % 10));
300 while (typevec[tindex] != type)
318 static int numeric_output_need_bar;
319 static void build_overload_identifier ();
322 build_overload_nested_name (decl)
325 if (DECL_CONTEXT (decl))
327 tree context = DECL_CONTEXT (decl);
328 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
329 context = TYPE_MAIN_DECL (context);
330 build_overload_nested_name (context);
333 if (TREE_CODE (decl) == FUNCTION_DECL)
335 tree name = DECL_ASSEMBLER_NAME (decl);
337 extern int var_labelno;
339 ASM_FORMAT_PRIVATE_NAME (label, IDENTIFIER_POINTER (name), var_labelno);
342 if (numeric_output_need_bar)
345 numeric_output_need_bar = 0;
347 icat (strlen (label));
352 tree name = DECL_NAME (decl);
353 build_overload_identifier (name);
358 build_overload_value (type, value)
361 while (TREE_CODE (value) == NON_LVALUE_EXPR
362 || TREE_CODE (value) == NOP_EXPR)
363 value = TREE_OPERAND (value, 0);
364 my_friendly_assert (TREE_CODE (type) == PARM_DECL, 242);
365 type = TREE_TYPE (type);
366 if (TREE_CODE (type) == POINTER_TYPE
367 && TREE_CODE (TREE_TYPE (type)) == OFFSET_TYPE)
369 /* Handle a pointer to member as a template instantiation
370 parameter, boy, what fun! */
371 type = integer_type_node;
372 if (TREE_CODE (value) != INTEGER_CST)
374 sorry ("unknown pointer to member constant");
379 switch (TREE_CODE (type))
384 my_friendly_assert (TREE_CODE (value) == INTEGER_CST, 243);
385 if (TYPE_PRECISION (value) == 2 * HOST_BITS_PER_WIDE_INT)
387 if (tree_int_cst_lt (value, integer_zero_node))
390 value = build_int_2 (~ TREE_INT_CST_LOW (value),
391 - TREE_INT_CST_HIGH (value));
393 if (TREE_INT_CST_HIGH (value)
394 != (TREE_INT_CST_LOW (value) >> (HOST_BITS_PER_WIDE_INT - 1)))
396 /* need to print a DImode value in decimal */
397 sorry ("conversion of long long as PT parameter");
399 /* else fall through to print in smaller mode */
401 /* Wordsize or smaller */
402 icat (TREE_INT_CST_LOW (value));
407 icat (TREE_INT_CST_LOW (value));
410 #ifndef REAL_IS_NOT_DOUBLE
414 char *bufp = digit_buffer;
415 extern char *index ();
417 my_friendly_assert (TREE_CODE (value) == REAL_CST, 244);
418 val = TREE_REAL_CST (value);
424 sprintf (bufp, "%e", val);
425 bufp = (char *) index (bufp, 'e');
427 strcat (digit_buffer, "e0");
453 OB_PUTCP (digit_buffer);
458 value = TREE_OPERAND (value, 0);
459 if (TREE_CODE (value) == VAR_DECL)
461 my_friendly_assert (DECL_NAME (value) != 0, 245);
462 build_overload_identifier (DECL_NAME (value));
465 else if (TREE_CODE (value) == FUNCTION_DECL)
467 my_friendly_assert (DECL_NAME (value) != 0, 246);
468 build_overload_identifier (DECL_NAME (value));
472 my_friendly_abort (71);
473 break; /* not really needed */
476 sorry ("conversion of %s as template parameter",
477 tree_code_name [(int) TREE_CODE (type)]);
478 my_friendly_abort (72);
483 build_overload_identifier (name)
486 if (IDENTIFIER_TEMPLATE (name))
488 tree template, parmlist, arglist, tname;
490 template = IDENTIFIER_TEMPLATE (name);
491 arglist = TREE_VALUE (template);
492 template = TREE_PURPOSE (template);
493 tname = DECL_NAME (template);
494 parmlist = DECL_ARGUMENTS (template);
495 nparms = TREE_VEC_LENGTH (parmlist);
497 icat (IDENTIFIER_LENGTH (tname));
500 for (i = 0; i < nparms; i++)
502 tree parm = TREE_VALUE (TREE_VEC_ELT (parmlist, i));
503 tree arg = TREE_VEC_ELT (arglist, i);
504 if (TREE_CODE (parm) == TYPE_DECL)
506 /* This parameter is a type. */
508 build_overload_name (arg, 0, 0);
512 /* It's a PARM_DECL. */
513 build_overload_name (TREE_TYPE (parm), 0, 0);
514 build_overload_value (parm, arg);
515 numeric_output_need_bar = 1;
521 if (numeric_output_need_bar)
524 numeric_output_need_bar = 0;
526 icat (IDENTIFIER_LENGTH (name));
531 /* Given a list of parameters in PARMTYPES, create an unambiguous
532 overload string. Should distinguish any type that C (or C++) can
533 distinguish. I.e., pointers to functions are treated correctly.
535 Caller must deal with whether a final `e' goes on the end or not.
537 Any default conversions must take place before this function
540 BEGIN and END control initialization and finalization of the
541 obstack where we build the string. */
544 build_overload_name (parmtypes, begin, end)
551 if (begin) OB_INIT ();
552 numeric_output_need_bar = 0;
554 if ((just_one = (TREE_CODE (parmtypes) != TREE_LIST)))
556 parmtype = parmtypes;
562 parmtype = TREE_VALUE (parmtypes);
566 if (! nofold && ! just_one)
568 /* Every argument gets counted. */
569 typevec[maxtype++] = parmtype;
571 if (TREE_USED (parmtype) && parmtype == typevec[maxtype-2])
578 flush_repeats (typevec[maxtype-2]);
580 if (TREE_USED (parmtype))
582 flush_repeats (parmtype);
586 /* Only cache types which take more than one character. */
587 if (parmtype != TYPE_MAIN_VARIANT (parmtype)
588 || (TREE_CODE (parmtype) != INTEGER_TYPE
589 && TREE_CODE (parmtype) != REAL_TYPE))
590 TREE_USED (parmtype) = 1;
593 if (TYPE_PTRMEMFUNC_P (parmtype))
594 parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype);
596 if (TREE_READONLY (parmtype))
598 if (TREE_CODE (parmtype) == INTEGER_TYPE
599 && TYPE_MAIN_VARIANT (parmtype) == unsigned_type (TYPE_MAIN_VARIANT (parmtype)))
601 if (TYPE_VOLATILE (parmtype))
604 switch (TREE_CODE (parmtype))
608 build_overload_name (TYPE_OFFSET_BASETYPE (parmtype), 0, 0);
610 build_overload_name (TREE_TYPE (parmtype), 0, 0);
618 #if PARM_CAN_BE_ARRAY_TYPE
623 if (TYPE_DOMAIN (parmtype) == NULL_TREE)
624 error ("pointer or reference to array of unknown bound in parm type");
627 length = array_type_nelts (parmtype);
628 if (TREE_CODE (length) == INTEGER_CST)
629 icat (TREE_INT_CST_LOW (length) + 1);
642 build_overload_name (TREE_TYPE (parmtype), 0, 0);
648 tree firstarg = TYPE_ARG_TYPES (parmtype);
649 /* Otherwise have to implement reentrant typevecs,
650 unmark and remark types, etc. */
651 int old_nofold = nofold;
655 flush_repeats (typevec[maxtype-1]);
657 /* @@ It may be possible to pass a function type in
658 which is not preceded by a 'P'. */
659 if (TREE_CODE (parmtype) == FUNCTION_TYPE)
662 if (firstarg == NULL_TREE)
664 else if (firstarg == void_list_node)
667 build_overload_name (firstarg, 0, 0);
671 int constp = TYPE_READONLY (TREE_TYPE (TREE_VALUE (firstarg)));
672 int volatilep = TYPE_VOLATILE (TREE_TYPE (TREE_VALUE (firstarg)));
674 firstarg = TREE_CHAIN (firstarg);
676 build_overload_name (TYPE_METHOD_BASETYPE (parmtype), 0, 0);
682 /* For cfront 2.0 compatibility. */
685 if (firstarg == NULL_TREE)
687 else if (firstarg == void_list_node)
690 build_overload_name (firstarg, 0, 0);
693 /* Separate args from return type. */
695 build_overload_name (TREE_TYPE (parmtype), 0, 0);
701 parmtype = TYPE_MAIN_VARIANT (parmtype);
702 if (parmtype == integer_type_node
703 || parmtype == unsigned_type_node)
705 else if (parmtype == long_integer_type_node
706 || parmtype == long_unsigned_type_node)
708 else if (parmtype == short_integer_type_node
709 || parmtype == short_unsigned_type_node)
711 else if (parmtype == signed_char_type_node)
716 else if (parmtype == char_type_node
717 || parmtype == unsigned_char_type_node)
719 else if (parmtype == wchar_type_node)
721 else if (parmtype == long_long_integer_type_node
722 || parmtype == long_long_unsigned_type_node)
725 /* it would seem there is no way to enter these in source code,
727 else if (parmtype == long_long_long_integer_type_node
728 || parmtype == long_long_long_unsigned_type_node)
732 my_friendly_abort (73);
740 parmtype = TYPE_MAIN_VARIANT (parmtype);
741 if (parmtype == long_double_type_node)
743 else if (parmtype == double_type_node)
745 else if (parmtype == float_type_node)
747 else my_friendly_abort (74);
754 extern tree void_list_node;
756 /* See if anybody is wasting memory. */
757 my_friendly_assert (parmtypes == void_list_node, 247);
759 /* This is the end of a parameter list. */
760 if (end) OB_FINISH ();
761 return (char *)obstack_base (&scratch_obstack);
766 case ERROR_MARK: /* not right, but nothing is anyway */
769 /* have to do these */
773 /* Make this type signature look incompatible
780 tree name = TYPE_NAME (parmtype);
783 if (TREE_CODE (name) == TYPE_DECL)
787 /* If DECL_ASSEMBLER_NAME has been set properly, use it. */
788 if (DECL_ASSEMBLER_NAME (context) != DECL_NAME (context))
790 OB_PUTID (DECL_ASSEMBLER_NAME (context));
793 while (DECL_CONTEXT (context))
796 context = DECL_CONTEXT (context);
797 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
798 context = TYPE_NAME (context);
800 name = DECL_NAME (name);
802 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 248);
811 numeric_output_need_bar = 0;
812 build_overload_nested_name (TYPE_MAIN_DECL (parmtype));
815 build_overload_identifier (name);
820 /* This will take some work. */
824 case TEMPLATE_TYPE_PARM:
825 case TEMPLATE_CONST_PARM:
826 case UNINSTANTIATED_P_TYPE:
827 /* We don't ever want this output, but it's inconvenient not to
828 be able to build the string. This should cause assembler
829 errors we'll notice. */
832 sprintf (digit_buffer, " *%d", n++);
833 OB_PUTCP (digit_buffer);
838 my_friendly_abort (75);
843 parmtypes = TREE_CHAIN (parmtypes);
848 flush_repeats (typevec[maxtype-1]);
850 /* To get here, parms must end with `...'. */
854 if (end) OB_FINISH ();
855 return (char *)obstack_base (&scratch_obstack);
859 build_static_name (basetype, name)
862 char *basename = build_overload_name (basetype, 1, 1);
863 char *buf = (char *) alloca (IDENTIFIER_LENGTH (name)
864 + sizeof (STATIC_NAME_FORMAT)
865 + strlen (basename));
866 sprintf (buf, STATIC_NAME_FORMAT, basename, IDENTIFIER_POINTER (name));
867 return get_identifier (buf);
870 /* Generate an identifier that encodes the (ANSI) exception TYPE. */
872 /* This should be part of `ansi_opname', or at least be defined by the std. */
873 #define EXCEPTION_NAME_PREFIX "__ex"
874 #define EXCEPTION_NAME_LENGTH 4
877 cplus_exception_name (type)
881 OB_PUTS (EXCEPTION_NAME_PREFIX);
882 return get_identifier (build_overload_name (type, 0, 1));
885 /* Change the name of a function definition so that it may be
886 overloaded. NAME is the name of the function to overload,
887 PARMS is the parameter list (which determines what name the
888 final function obtains).
890 FOR_METHOD is 1 if this overload is being performed
891 for a method, rather than a function type. It is 2 if
892 this overload is being performed for a constructor. */
894 build_decl_overload (dname, parms, for_method)
899 char *name = IDENTIFIER_POINTER (dname);
901 /* member operators new and delete look like methods at this point. */
902 if (! for_method && parms != NULL_TREE && TREE_CODE (parms) == TREE_LIST)
904 if (dname == ansi_opname[(int) DELETE_EXPR])
905 return get_identifier ("__builtin_delete");
906 else if (dname == ansi_opname[(int) VEC_DELETE_EXPR])
907 return get_identifier ("__builtin_vec_delete");
908 else if (TREE_CHAIN (parms) == void_list_node)
910 if (dname == ansi_opname[(int) NEW_EXPR])
911 return get_identifier ("__builtin_new");
912 else if (dname == ansi_opname[(int) VEC_NEW_EXPR])
913 return get_identifier ("__builtin_vec_new");
920 /* Otherwise, we can divine that this is a constructor,
921 and figure out its name without any extra encoding. */
927 /* We can get away without doing this. */
931 tree this_type = TREE_VALUE (parms);
933 if (TREE_CODE (this_type) == RECORD_TYPE) /* a signature pointer */
934 parms = temp_tree_cons (NULL_TREE, SIGNATURE_TYPE (this_type),
937 parms = temp_tree_cons (NULL_TREE, TREE_TYPE (this_type),
944 if (parms == NULL_TREE)
945 OB_PUTC2 ('e', '\0');
946 else if (parms == void_list_node)
947 OB_PUTC2 ('v', '\0');
950 ALLOCATE_TYPEVEC (parms);
954 build_overload_name (TREE_VALUE (parms), 0, 0);
956 typevec[maxtype++] = TREE_VALUE (parms);
957 TREE_USED (TREE_VALUE (parms)) = 1;
959 if (TREE_CHAIN (parms))
960 build_overload_name (TREE_CHAIN (parms), 0, 1);
962 OB_PUTC2 ('e', '\0');
965 build_overload_name (parms, 0, 1);
966 DEALLOCATE_TYPEVEC (parms);
969 tree n = get_identifier (obstack_base (&scratch_obstack));
970 if (IDENTIFIER_OPNAME_P (dname))
971 IDENTIFIER_OPNAME_P (n) = 1;
976 /* Build an overload name for the type expression TYPE. */
978 build_typename_overload (type)
984 OB_PUTID (ansi_opname[(int) TYPE_EXPR]);
986 build_overload_name (type, 0, 1);
987 id = get_identifier (obstack_base (&scratch_obstack));
988 IDENTIFIER_OPNAME_P (id) = 1;
990 IDENTIFIER_GLOBAL_VALUE (id) = TYPE_NAME (type);
992 TREE_TYPE (id) = type;
996 #ifndef NO_DOLLAR_IN_LABEL
997 #define T_DESC_FORMAT "TD$"
998 #define I_DESC_FORMAT "ID$"
999 #define M_DESC_FORMAT "MD$"
1001 #if !defined(NO_DOT_IN_LABEL)
1002 #define T_DESC_FORMAT "TD."
1003 #define I_DESC_FORMAT "ID."
1004 #define M_DESC_FORMAT "MD."
1006 #define T_DESC_FORMAT "__t_desc_"
1007 #define I_DESC_FORMAT "__i_desc_"
1008 #define M_DESC_FORMAT "__m_desc_"
1012 /* Build an overload name for the type expression TYPE. */
1014 build_t_desc_overload (type)
1018 OB_PUTS (T_DESC_FORMAT);
1022 /* Use a different format if the type isn't defined yet. */
1023 if (TYPE_SIZE (type) == NULL_TREE)
1028 for (p = tname; *p; p++)
1034 /* If there's no change, we have an inappropriate T_DESC_FORMAT. */
1035 my_friendly_assert (changed != 0, 249);
1039 build_overload_name (type, 0, 1);
1040 return get_identifier (obstack_base (&scratch_obstack));
1043 /* Top-level interface to explicit overload requests. Allow NAME
1044 to be overloaded. Error if NAME is already declared for the current
1045 scope. Warning if function is redundantly overloaded. */
1048 declare_overloaded (name)
1051 #ifdef NO_AUTO_OVERLOAD
1052 if (is_overloaded (name))
1053 warning ("function `%s' already declared overloaded",
1054 IDENTIFIER_POINTER (name));
1055 else if (IDENTIFIER_GLOBAL_VALUE (name))
1056 error ("overloading function `%s' that is already defined",
1057 IDENTIFIER_POINTER (name));
1060 TREE_OVERLOADED (name) = 1;
1061 IDENTIFIER_GLOBAL_VALUE (name) = build_tree_list (name, NULL_TREE);
1062 TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)) = unknown_type_node;
1065 if (current_lang_name == lang_name_cplusplus)
1068 warning ("functions are implicitly overloaded in C++");
1070 else if (current_lang_name == lang_name_c)
1071 error ("overloading function `%s' cannot be done in C language context");
1073 my_friendly_abort (76);
1077 #ifdef NO_AUTO_OVERLOAD
1078 /* Check to see if NAME is overloaded. For first approximation,
1079 check to see if its TREE_OVERLOADED is set. This is used on
1080 IDENTIFIER nodes. */
1082 is_overloaded (name)
1086 return (TREE_OVERLOADED (name)
1087 && (! IDENTIFIER_CLASS_VALUE (name) || current_class_type == 0)
1088 && ! IDENTIFIER_LOCAL_VALUE (name));
1092 /* Given a tree_code CODE, and some arguments (at least one),
1093 attempt to use an overloaded operator on the arguments.
1095 For unary operators, only the first argument need be checked.
1096 For binary operators, both arguments may need to be checked.
1098 Member functions can convert class references to class pointers,
1099 for one-level deep indirection. More than that is not supported.
1100 Operators [](), ()(), and ->() must be member functions.
1102 We call function call building calls with LOOKUP_COMPLAIN if they
1103 are our only hope. This is true when we see a vanilla operator
1104 applied to something of aggregate type. If this fails, we are free
1105 to return `error_mark_node', because we will have reported the
1108 Operators NEW and DELETE overload in funny ways: operator new takes
1109 a single `size' parameter, and operator delete takes a pointer to the
1110 storage being deleted. When overloading these operators, success is
1111 assumed. If there is a failure, report an error message and return
1112 `error_mark_node'. */
1116 build_opfncall (code, flags, xarg1, xarg2, arg3)
1117 enum tree_code code;
1119 tree xarg1, xarg2, arg3;
1123 tree type1, type2, fnname;
1124 tree fields1 = 0, parms = 0;
1127 int binary_is_unary;
1129 if (xarg1 == error_mark_node)
1130 return error_mark_node;
1132 if (code == COND_EXPR)
1134 if (TREE_CODE (xarg2) == ERROR_MARK
1135 || TREE_CODE (arg3) == ERROR_MARK)
1136 return error_mark_node;
1138 if (code == COMPONENT_REF)
1139 if (TREE_CODE (TREE_TYPE (xarg1)) == POINTER_TYPE)
1142 /* First, see if we can work with the first argument */
1143 type1 = TREE_TYPE (xarg1);
1145 /* Some tree codes have length > 1, but we really only want to
1146 overload them if their first argument has a user defined type. */
1149 case PREINCREMENT_EXPR:
1150 case PREDECREMENT_EXPR:
1151 case POSTINCREMENT_EXPR:
1152 case POSTDECREMENT_EXPR:
1154 binary_is_unary = 1;
1158 /* ARRAY_REFs and CALL_EXPRs must overload successfully.
1159 If they do not, return error_mark_node instead of NULL_TREE. */
1161 if (xarg2 == error_mark_node)
1162 return error_mark_node;
1164 rval = error_mark_node;
1165 binary_is_unary = 0;
1172 tree args = tree_cons (NULL_TREE, xarg2, arg3);
1173 fnname = ansi_opname[(int) code];
1174 if (flags & LOOKUP_GLOBAL)
1175 return build_overload_call (fnname, args, flags & LOOKUP_COMPLAIN,
1176 (struct candidate *)0);
1178 rval = build_method_call
1179 (build_indirect_ref (build1 (NOP_EXPR, xarg1, error_mark_node),
1181 fnname, args, NULL_TREE, flags);
1182 if (rval == error_mark_node)
1183 /* User might declare fancy operator new, but invoke it
1184 like standard one. */
1187 TREE_TYPE (rval) = xarg1;
1188 TREE_CALLS_NEW (rval) = 1;
1193 case VEC_DELETE_EXPR:
1196 fnname = ansi_opname[(int) code];
1197 if (flags & LOOKUP_GLOBAL)
1198 return build_overload_call (fnname,
1199 build_tree_list (NULL_TREE, xarg1),
1200 flags & LOOKUP_COMPLAIN,
1201 (struct candidate *)0);
1203 rval = build_method_call
1204 (build_indirect_ref (build1 (NOP_EXPR, TREE_TYPE (xarg1),
1207 fnname, tree_cons (NULL_TREE, xarg1,
1208 build_tree_list (NULL_TREE, xarg2)),
1211 /* This can happen when operator delete is protected. */
1212 my_friendly_assert (rval != error_mark_node, 250);
1213 TREE_TYPE (rval) = void_type_node;
1220 binary_is_unary = 0;
1221 try_second = tree_code_length [(int) code] == 2;
1222 if (try_second && xarg2 == error_mark_node)
1223 return error_mark_node;
1227 if (try_second && xarg2 == error_mark_node)
1228 return error_mark_node;
1230 /* What ever it was, we do not know how to deal with it. */
1231 if (type1 == NULL_TREE)
1234 if (TREE_CODE (type1) == OFFSET_TYPE)
1235 type1 = TREE_TYPE (type1);
1237 if (TREE_CODE (type1) == REFERENCE_TYPE)
1239 arg1 = convert_from_reference (xarg1);
1240 type1 = TREE_TYPE (arg1);
1247 if (!IS_AGGR_TYPE (type1) || TYPE_PTRMEMFUNC_P (type1))
1249 /* Try to fail. First, fail if unary */
1252 /* Second, see if second argument is non-aggregate. */
1253 type2 = TREE_TYPE (xarg2);
1254 if (TREE_CODE (type2) == OFFSET_TYPE)
1255 type2 = TREE_TYPE (type2);
1256 if (TREE_CODE (type2) == REFERENCE_TYPE)
1258 arg2 = convert_from_reference (xarg2);
1259 type2 = TREE_TYPE (arg2);
1266 if (!IS_AGGR_TYPE (type2))
1273 /* First arg may succeed; see whether second should. */
1274 type2 = TREE_TYPE (xarg2);
1275 if (TREE_CODE (type2) == OFFSET_TYPE)
1276 type2 = TREE_TYPE (type2);
1277 if (TREE_CODE (type2) == REFERENCE_TYPE)
1279 arg2 = convert_from_reference (xarg2);
1280 type2 = TREE_TYPE (arg2);
1287 if (! IS_AGGR_TYPE (type2))
1291 if (type1 == unknown_type_node
1292 || (try_second && TREE_TYPE (xarg2) == unknown_type_node))
1294 /* This will not be implemented in the foreseeable future. */
1298 if (code == MODIFY_EXPR)
1299 fnname = ansi_assopname[(int) TREE_CODE (arg3)];
1301 fnname = ansi_opname[(int) code];
1303 global_fn = lookup_name_nonclass (fnname);
1305 /* This is the last point where we will accept failure. This
1306 may be too eager if we wish an overloaded operator not to match,
1307 but would rather a normal operator be called on a type-converted
1310 if (IS_AGGR_TYPE (type1))
1312 fields1 = lookup_fnfields (TYPE_BINFO (type1), fnname, 0);
1313 /* ARM $13.4.7, prefix/postfix ++/--. */
1314 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1316 xarg2 = integer_zero_node;
1317 binary_is_unary = 0;
1322 int have_postfix = 0;
1324 /* Look for an `operator++ (int)'. If they didn't have
1325 one, then we fall back to the old way of doing things. */
1326 for (t = TREE_VALUE (fields1); t ; t = TREE_CHAIN (t))
1328 t2 = TYPE_ARG_TYPES (TREE_TYPE (t));
1329 if (TREE_CHAIN (t2) != NULL_TREE
1330 && TREE_VALUE (TREE_CHAIN (t2)) == integer_type_node)
1339 char *op = POSTINCREMENT_EXPR ? "++" : "--";
1341 /* There's probably a LOT of code in the world that
1342 relies upon this old behavior. So we'll only give this
1343 warning when we've been given -pedantic. A few
1344 releases after 2.4, we'll convert this to be a pedwarn
1345 or something else more appropriate. */
1347 warning ("no `operator%s (int)' declared for postfix `%s'",
1350 binary_is_unary = 1;
1356 if (fields1 == NULL_TREE && global_fn == NULL_TREE)
1359 /* If RVAL winds up being `error_mark_node', we will return
1360 that... There is no way that normal semantics of these
1361 operators will succeed. */
1363 /* This argument may be an uncommitted OFFSET_REF. This is
1364 the case for example when dealing with static class members
1365 which are referenced from their class name rather than
1366 from a class instance. */
1367 if (TREE_CODE (xarg1) == OFFSET_REF
1368 && TREE_CODE (TREE_OPERAND (xarg1, 1)) == VAR_DECL)
1369 xarg1 = TREE_OPERAND (xarg1, 1);
1370 if (try_second && xarg2 && TREE_CODE (xarg2) == OFFSET_REF
1371 && TREE_CODE (TREE_OPERAND (xarg2, 1)) == VAR_DECL)
1372 xarg2 = TREE_OPERAND (xarg2, 1);
1375 flags |= LOOKUP_GLOBAL;
1377 if (code == CALL_EXPR)
1379 /* This can only be a member function. */
1380 return build_method_call (xarg1, fnname, xarg2,
1381 NULL_TREE, LOOKUP_NORMAL);
1383 else if (tree_code_length[(int) code] == 1 || binary_is_unary)
1386 rval = build_method_call (xarg1, fnname, NULL_TREE, NULL_TREE, flags);
1388 else if (code == COND_EXPR)
1390 parms = tree_cons (0, xarg2, build_tree_list (NULL_TREE, arg3));
1391 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1393 else if (code == METHOD_CALL_EXPR)
1395 /* must be a member function. */
1396 parms = tree_cons (NULL_TREE, xarg2, arg3);
1397 return build_method_call (xarg1, fnname, parms, NULL_TREE,
1402 parms = build_tree_list (NULL_TREE, xarg2);
1403 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1407 parms = tree_cons (NULL_TREE, xarg1,
1408 build_tree_list (NULL_TREE, xarg2));
1409 rval = build_overload_call (fnname, parms, flags,
1410 (struct candidate *)0);
1416 /* This function takes an identifier, ID, and attempts to figure out what
1417 it means. There are a number of possible scenarios, presented in increasing
1420 1) not in a class's scope
1421 2) in class's scope, member name of the class's method
1422 3) in class's scope, but not a member name of the class
1423 4) in class's scope, member name of a class's variable
1425 NAME is $1 from the bison rule. It is an IDENTIFIER_NODE.
1426 VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1)
1427 yychar is the pending input character (suitably encoded :-).
1429 As a last ditch, try to look up the name as a label and return that
1432 Values which are declared as being of REFERENCE_TYPE are
1433 automatically dereferenced here (as a hack to make the
1434 compiler faster). */
1437 hack_identifier (value, name, yychar)
1443 if (TREE_CODE (value) == ERROR_MARK)
1445 if (current_class_name)
1447 tree fields = lookup_fnfields (TYPE_BINFO (current_class_type), name, 1);
1448 if (fields == error_mark_node)
1449 return error_mark_node;
1454 fndecl = TREE_VALUE (fields);
1455 my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251);
1456 if (DECL_CHAIN (fndecl) == NULL_TREE)
1458 warning ("methods cannot be converted to function pointers");
1463 error ("ambiguous request for method pointer `%s'",
1464 IDENTIFIER_POINTER (name));
1465 return error_mark_node;
1469 if (flag_labels_ok && IDENTIFIER_LABEL_VALUE (name))
1471 return IDENTIFIER_LABEL_VALUE (name);
1473 return error_mark_node;
1476 type = TREE_TYPE (value);
1477 if (TREE_CODE (value) == FIELD_DECL)
1479 if (current_class_decl == NULL_TREE)
1481 error ("request for member `%s' in static member function",
1482 IDENTIFIER_POINTER (DECL_NAME (value)));
1483 return error_mark_node;
1485 TREE_USED (current_class_decl) = 1;
1487 /* Mark so that if we are in a constructor, and then find that
1488 this field was initialized by a base initializer,
1489 we can emit an error message. */
1490 TREE_USED (value) = 1;
1491 return build_component_ref (C_C_D, name, 0, 1);
1494 if (really_overloaded_fn (value))
1496 tree t = get_first_fn (value);
1497 for (; t; t = DECL_CHAIN (t))
1499 if (TREE_CODE (t) == TEMPLATE_DECL)
1502 assemble_external (t);
1506 else if (TREE_CODE (value) == TREE_LIST)
1509 while (t && TREE_CODE (t) == TREE_LIST)
1511 assemble_external (TREE_VALUE (t));
1518 assemble_external (value);
1519 TREE_USED (value) = 1;
1522 if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value))
1524 if (DECL_LANG_SPECIFIC (value)
1525 && DECL_CLASS_CONTEXT (value) != current_class_type)
1528 enum access_type access;
1529 register tree context
1530 = (TREE_CODE (value) == FUNCTION_DECL && DECL_VIRTUAL_P (value))
1531 ? DECL_CLASS_CONTEXT (value)
1532 : DECL_CONTEXT (value);
1534 get_base_distance (context, current_class_type, 0, &path);
1537 access = compute_access (path, value);
1538 if (access != access_public)
1540 if (TREE_CODE (value) == VAR_DECL)
1541 error ("static member `%s' is %s",
1542 IDENTIFIER_POINTER (name),
1543 TREE_PRIVATE (value) ? "private" :
1544 "from a private base class");
1546 error ("enum `%s' is from private base class",
1547 IDENTIFIER_POINTER (name));
1548 return error_mark_node;
1554 if (TREE_CODE (value) == TREE_LIST && TREE_NONLOCAL_FLAG (value))
1558 error ("request for member `%s' is ambiguous in multiple inheritance lattice",
1559 IDENTIFIER_POINTER (name));
1560 return error_mark_node;
1566 if (TREE_CODE (type) == REFERENCE_TYPE)
1568 my_friendly_assert (TREE_CODE (value) == VAR_DECL
1569 || TREE_CODE (value) == PARM_DECL
1570 || TREE_CODE (value) == RESULT_DECL, 252);
1571 return convert_from_reference (value);
1578 /* Given an object OF, and a type conversion operator COMPONENT
1579 build a call to the conversion operator, if a call is requested,
1580 or return the address (as a pointer to member function) if one is not.
1582 OF can be a TYPE_DECL or any kind of datum that would normally
1583 be passed to `build_component_ref'. It may also be NULL_TREE,
1584 in which case `current_class_type' and `current_class_decl'
1585 provide default values.
1587 BASETYPE_PATH, if non-null, is the path of basetypes
1588 to go through before we get the the instance of interest.
1590 PROTECT says whether we apply C++ scoping rules or not. */
1592 build_component_type_expr (of, component, basetype_path, protect)
1593 tree of, component, basetype_path;
1596 tree cname = NULL_TREE;
1599 int flags = protect ? LOOKUP_NORMAL : LOOKUP_COMPLAIN;
1602 my_friendly_assert (IS_AGGR_TYPE (TREE_TYPE (of)), 253);
1603 my_friendly_assert (TREE_CODE (component) == TYPE_EXPR, 254);
1605 tmp = TREE_OPERAND (component, 0);
1610 switch (TREE_CODE (tmp))
1614 TREE_OPERAND (last, 0) = TREE_OPERAND (tmp, 0);
1616 TREE_OPERAND (component, 0) = TREE_OPERAND (tmp, 0);
1618 last = groktypename (build_tree_list (TREE_TYPE (component),
1619 TREE_OPERAND (component, 0)));
1620 name = build_typename_overload (last);
1621 TREE_TYPE (name) = last;
1623 if (TREE_OPERAND (tmp, 0)
1624 && TREE_OPERAND (tmp, 0) != void_list_node)
1626 cp_error ("`operator %T' requires empty parameter list", last);
1627 TREE_OPERAND (tmp, 0) = NULL_TREE;
1630 if (of && TREE_CODE (of) != TYPE_DECL)
1631 return build_method_call (of, name, NULL_TREE, NULL_TREE, flags);
1636 if (current_class_decl == NULL_TREE)
1638 cp_error ("object required for `operator %T' call",
1640 return error_mark_node;
1643 this_this = convert_pointer_to (TREE_TYPE (of),
1644 current_class_decl);
1645 this_this = build_indirect_ref (this_this, NULL_PTR);
1646 return build_method_call (this_this, name, NULL_TREE,
1647 NULL_TREE, flags | LOOKUP_NONVIRTUAL);
1649 else if (current_class_decl)
1650 return build_method_call (tmp, name, NULL_TREE, NULL_TREE, flags);
1652 cp_error ("object required for `operator %T' call",
1654 return error_mark_node;
1662 my_friendly_assert (cname == 0, 255);
1663 cname = TREE_OPERAND (tmp, 0);
1664 tmp = TREE_OPERAND (tmp, 1);
1668 my_friendly_abort (77);
1671 tmp = TREE_OPERAND (tmp, 0);
1674 last = groktypename (build_tree_list (TREE_TYPE (component), TREE_OPERAND (component, 0)));
1675 name = build_typename_overload (last);
1676 TREE_TYPE (name) = last;
1677 if (of && TREE_CODE (of) == TYPE_DECL)
1679 if (cname == NULL_TREE)
1681 cname = DECL_NAME (of);
1684 else my_friendly_assert (cname == DECL_NAME (of), 256);
1691 if (current_class_decl == NULL_TREE)
1693 cp_error ("object required for `operator %T' call",
1695 return error_mark_node;
1698 this_this = convert_pointer_to (TREE_TYPE (of), current_class_decl);
1699 return build_component_ref (this_this, name, 0, protect);
1702 return build_offset_ref (cname, name);
1703 else if (current_class_name)
1704 return build_offset_ref (current_class_name, name);
1706 cp_error ("object required for `operator %T' member reference",
1708 return error_mark_node;
1713 thunk_printable_name (decl)
1716 return "<thunk function>";
1720 make_thunk (function, delta)
1725 tree thunk_fndecl, thunk_id;
1728 static int thunk_number = 0;
1730 if (TREE_CODE (function) != ADDR_EXPR)
1732 func_decl = TREE_OPERAND (function, 0);
1733 if (TREE_CODE (func_decl) != FUNCTION_DECL)
1735 func_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func_decl));
1737 sprintf (buffer, "__thunk_%d_%s", -delta, func_name);
1739 sprintf (buffer, "__thunk_n%d_%s", delta, func_name);
1740 thunk_id = get_identifier (buffer);
1741 thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id);
1742 if (thunk && TREE_CODE (thunk) != THUNK_DECL)
1744 error_with_decl ("implementation-reserved name `%s' used");
1745 IDENTIFIER_GLOBAL_VALUE (thunk_id) = thunk = NULL_TREE;
1747 if (thunk == NULL_TREE)
1749 thunk = build_decl (THUNK_DECL, thunk_id, TREE_TYPE (func_decl));
1751 = build_decl (RESULT_DECL, NULL_TREE, TREE_TYPE (vtable_entry_type));
1752 make_function_rtl (thunk);
1753 DECL_INITIAL (thunk) = function;
1754 THUNK_DELTA (thunk) = delta;
1755 /* So that finish_file can write out any thunks that need to be: */
1756 pushdecl_top_level (thunk);
1762 emit_thunk (thunk_fndecl)
1769 struct args_size stack_args_size;
1770 tree function = TREE_OPERAND (DECL_INITIAL (thunk_fndecl), 0);
1771 int delta = THUNK_DELTA (thunk_fndecl);
1774 int current_call_is_indirect = 0; /* needed for HPPA FUNCTION_ARG */
1776 /* Used to remember which regs we need to emit a USE rtx for. */
1777 rtx need_use[FIRST_PSEUDO_REGISTER];
1778 int need_use_count = 0;
1780 /* rtx for the 'this' parameter. */
1781 rtx this_rtx = 0, this_reg_rtx = 0, fixed_this_rtx;
1783 char *(*save_decl_printable_name) () = decl_printable_name;
1784 /* Data on reg parms scanned so far. */
1785 CUMULATIVE_ARGS args_so_far;
1787 if (TREE_ASM_WRITTEN (thunk_fndecl))
1790 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
1792 if (TREE_PUBLIC (function))
1794 TREE_PUBLIC (thunk_fndecl) = 1;
1795 if (DECL_EXTERNAL (function))
1797 DECL_EXTERNAL (thunk_fndecl) = 1;
1798 assemble_external (thunk_fndecl);
1803 decl_printable_name = thunk_printable_name;
1804 if (current_function_decl)
1806 current_function_decl = thunk_fndecl;
1807 init_function_start (thunk_fndecl, input_filename, lineno);
1809 expand_start_bindings (1);
1811 /* Start updating where the next arg would go. */
1812 INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (function), NULL_RTX);
1813 stack_args_size.constant = 0;
1814 stack_args_size.var = 0;
1815 /* SETUP for possible structure return address FIXME */
1817 /* Now look through all the parameters, make sure that we
1818 don't clobber any registers used for parameters.
1819 Also, pick up an rtx for the first "this" parameter. */
1820 for (argp = TYPE_ARG_TYPES (TREE_TYPE (function));
1822 argp = TREE_CHAIN (argp))
1825 tree passed_type = TREE_VALUE (argp);
1826 register rtx entry_parm;
1827 int named = 1; /* FIXME */
1828 struct args_size stack_offset;
1829 struct args_size arg_size;
1831 if (passed_type == void_type_node)
1834 if ((TREE_CODE (TYPE_SIZE (passed_type)) != INTEGER_CST
1835 && contains_placeholder_p (TYPE_SIZE (passed_type)))
1836 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
1837 || FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far,
1838 TYPE_MODE (passed_type),
1842 passed_type = build_pointer_type (passed_type);
1844 entry_parm = FUNCTION_ARG (args_so_far,
1845 TYPE_MODE (passed_type),
1848 if (entry_parm != 0)
1849 need_use[need_use_count++] = entry_parm;
1851 locate_and_pad_parm (TYPE_MODE (passed_type), passed_type,
1852 #ifdef STACK_PARMS_IN_REG_PARM_AREA
1858 &stack_args_size, &stack_offset, &arg_size);
1860 /* REGNO (entry_parm);*/
1863 this_reg_rtx = entry_parm;
1866 rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
1868 rtx internal_arg_pointer, stack_parm;
1870 if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
1871 || ! (fixed_regs[ARG_POINTER_REGNUM]
1872 || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
1873 internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
1875 internal_arg_pointer = virtual_incoming_args_rtx;
1877 if (offset_rtx == const0_rtx)
1878 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1879 internal_arg_pointer);
1881 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1882 gen_rtx (PLUS, Pmode,
1883 internal_arg_pointer,
1887 this_rtx = entry_parm;
1890 FUNCTION_ARG_ADVANCE (args_so_far,
1891 TYPE_MODE (passed_type),
1896 fixed_this_rtx = plus_constant (this_rtx, delta);
1897 if (this_rtx != fixed_this_rtx)
1898 emit_move_insn (this_rtx, fixed_this_rtx);
1901 emit_insn (gen_rtx (USE, VOIDmode, this_reg_rtx));
1903 emit_indirect_jump (XEXP (DECL_RTL (function), 0));
1905 while (need_use_count > 0)
1906 emit_insn (gen_rtx (USE, VOIDmode, need_use[--need_use_count]));
1908 expand_end_bindings (NULL, 1, 0);
1911 /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
1912 Note that that may have been done above, in save_for_inline_copying.
1913 The call to resume_temporary_allocation near the end of this function
1914 goes back to the usual state of affairs. */
1916 rtl_in_current_obstack ();
1918 insns = get_insns ();
1920 /* Copy any shared structure that should not be shared. */
1922 unshare_all_rtl (insns);
1924 /* Instantiate all virtual registers. */
1926 instantiate_virtual_regs (current_function_decl, get_insns ());
1928 /* We are no longer anticipating cse in this function, at least. */
1930 cse_not_expected = 1;
1932 /* Now we choose between stupid (pcc-like) register allocation
1933 (if we got the -noreg switch and not -opt)
1934 and smart register allocation. */
1936 if (optimize > 0) /* Stupid allocation probably won't work */
1937 obey_regdecls = 0; /* if optimizations being done. */
1941 regclass (insns, max_reg_num ());
1944 stupid_life_analysis (insns, max_reg_num (), NULL);
1945 failure = reload (insns, 0, NULL);
1949 /* Do control and data flow analysis,
1950 and write some of the results to dump file. */
1952 flow_analysis (insns, max_reg_num (), NULL);
1954 failure = global_alloc (NULL);
1957 reload_completed = 1;
1959 #ifdef LEAF_REGISTERS
1961 if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
1965 /* If a machine dependent reorganization is needed, call it. */
1966 #ifdef MACHINE_DEPENDENT_REORG
1967 MACHINE_DEPENDENT_REORG (insns);
1970 /* Now turn the rtl into assembler code. */
1973 char *fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
1974 assemble_start_function (thunk_fndecl, fnname);
1975 final (insns, asm_out_file, optimize, 0);
1976 assemble_end_function (thunk_fndecl, fnname);
1979 exit_rest_of_compilation:
1981 reload_completed = 0;
1983 /* Cancel the effect of rtl_in_current_obstack. */
1985 resume_temporary_allocation ();
1987 decl_printable_name = save_decl_printable_name;
1988 current_function_decl = 0;
1991 /* Code for synthesizing methods which have default semantics defined. */
1993 /* For the anonymous union in TYPE, return the member that is at least as
1994 large as the rest of the members, so we can copy it. */
1996 largest_union_member (type)
1999 tree f, type_size = TYPE_SIZE (type);
2001 for (f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f))
2002 if (simple_cst_equal (DECL_SIZE (f), type_size) == 1)
2005 /* We should always find one. */
2006 my_friendly_abort (323);
2010 /* Generate code for default X(X&) constructor. */
2012 do_build_copy_constructor (fndecl)
2015 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
2021 if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
2022 parm = TREE_CHAIN (parm);
2023 parm = convert_from_reference (parm);
2025 if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
2027 t = build (INIT_EXPR, void_type_node, C_C_D, parm);
2028 TREE_SIDE_EFFECTS (t) = 1;
2029 cplus_expand_expr_stmt (t);
2033 tree fields = TYPE_FIELDS (current_class_type);
2034 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
2035 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
2038 for (t = CLASSTYPE_VBASECLASSES (current_class_type); t;
2041 tree basetype = BINFO_TYPE (t);
2042 tree p = convert_to_reference
2043 (build_reference_type (basetype), parm,
2044 CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE);
2045 p = convert_from_reference (p);
2046 current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype),
2047 p, current_base_init_list);
2050 for (i = 0; i < n_bases; ++i)
2052 tree p, basetype = TREE_VEC_ELT (binfos, i);
2053 if (TREE_VIA_VIRTUAL (basetype))
2056 basetype = BINFO_TYPE (basetype);
2057 p = convert_to_reference
2058 (build_reference_type (basetype), parm,
2059 CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE);
2060 p = convert_from_reference (p);
2061 current_base_init_list = tree_cons (TYPE_NESTED_NAME (basetype),
2062 p, current_base_init_list);
2064 for (; fields; fields = TREE_CHAIN (fields))
2067 tree field = fields;
2069 if (TREE_CODE (field) != FIELD_DECL)
2071 if (DECL_NAME (field))
2073 if (VFIELD_NAME_P (DECL_NAME (field)))
2075 if (VBASE_NAME_P (DECL_NAME (field)))
2078 /* True for duplicate members. */
2079 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
2082 else if ((t = TREE_TYPE (field)) != NULL_TREE
2083 && TREE_CODE (t) == UNION_TYPE
2084 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))
2085 && TYPE_FIELDS (t) != NULL_TREE)
2086 field = largest_union_member (t);
2090 init = build (COMPONENT_REF, TREE_TYPE (field), parm, field);
2091 init = build_tree_list (NULL_TREE, init);
2093 current_member_init_list
2094 = tree_cons (DECL_NAME (field), init, current_member_init_list);
2096 current_member_init_list = nreverse (current_member_init_list);
2097 current_base_init_list = nreverse (current_base_init_list);
2105 do_build_assign_ref (fndecl)
2108 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
2113 parm = convert_from_reference (parm);
2115 if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
2117 tree t = build (MODIFY_EXPR, void_type_node, C_C_D, parm);
2118 TREE_SIDE_EFFECTS (t) = 1;
2119 cplus_expand_expr_stmt (t);
2123 tree fields = TYPE_FIELDS (current_class_type);
2124 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
2125 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
2128 for (i = 0; i < n_bases; ++i)
2130 tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
2131 if (TYPE_HAS_ASSIGN_REF (basetype))
2133 tree p = convert_to_reference
2134 (build_reference_type (basetype), parm,
2135 CONV_IMPLICIT|CONV_CONST, LOOKUP_COMPLAIN, NULL_TREE);
2136 p = convert_from_reference (p);
2137 p = build_member_call (TYPE_NESTED_NAME (basetype),
2138 ansi_opname [MODIFY_EXPR],
2139 build_tree_list (NULL_TREE, p));
2140 expand_expr_stmt (p);
2143 for (; fields; fields = TREE_CHAIN (fields))
2146 tree field = fields;
2148 if (TREE_CODE (field) != FIELD_DECL)
2150 if (DECL_NAME (field))
2152 if (VFIELD_NAME_P (DECL_NAME (field)))
2154 if (VBASE_NAME_P (DECL_NAME (field)))
2157 /* True for duplicate members. */
2158 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
2161 else if ((t = TREE_TYPE (field)) != NULL_TREE
2162 && TREE_CODE (t) == UNION_TYPE
2163 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))
2164 && TYPE_FIELDS (t) != NULL_TREE)
2165 field = largest_union_member (t);
2169 comp = build (COMPONENT_REF, TREE_TYPE (field), C_C_D, field);
2170 init = build (COMPONENT_REF, TREE_TYPE (field), parm, field);
2172 expand_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
2175 c_expand_return (C_C_D);
2179 void push_cp_function_context ();
2180 void pop_cp_function_context ();
2183 synthesize_method (fndecl)
2186 int nested = (current_function_decl != NULL_TREE);
2187 tree context = decl_function_context (fndecl);
2188 char *f = input_filename;
2189 tree base = DECL_CLASS_CONTEXT (fndecl);
2192 push_cp_function_context (context);
2194 input_filename = DECL_SOURCE_FILE (fndecl);
2195 interface_unknown = CLASSTYPE_INTERFACE_UNKNOWN (base);
2196 interface_only = CLASSTYPE_INTERFACE_ONLY (base);
2197 start_function (NULL_TREE, fndecl, NULL_TREE, 1);
2198 store_parm_decls ();
2200 if (DECL_NAME (fndecl) == ansi_opname[MODIFY_EXPR])
2201 do_build_assign_ref (fndecl);
2202 else if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl)))
2206 tree arg_chain = FUNCTION_ARG_CHAIN (fndecl);
2207 if (DECL_CONSTRUCTOR_FOR_VBASE_P (fndecl))
2208 arg_chain = TREE_CHAIN (arg_chain);
2209 if (arg_chain != void_list_node)
2210 do_build_copy_constructor (fndecl);
2211 else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
2215 finish_function (lineno, 0, nested);
2217 /* Do we really *want* to inline this function? */
2218 if (DECL_INLINE (fndecl))
2220 /* Turn off DECL_INLINE for the moment so function_cannot_inline_p
2221 will check our size. */
2222 DECL_INLINE (fndecl) = 0;
2223 if (function_cannot_inline_p (fndecl) == 0)
2224 DECL_INLINE (fndecl) = 1;
2228 extract_interface_info ();
2230 pop_cp_function_context (context);