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 void build_overload_identifier ();
319 build_overload_nested_name (context)
322 /* We use DECL_NAME here, because pushtag now sets the DECL_ASSEMBLER_NAME. */
323 tree name = DECL_NAME (context);
324 if (DECL_CONTEXT (context))
326 context = DECL_CONTEXT (context);
327 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
328 context = TYPE_NAME (context);
329 build_overload_nested_name (context);
331 build_overload_identifier (name);
335 build_overload_value (type, value)
338 while (TREE_CODE (value) == NON_LVALUE_EXPR
339 || TREE_CODE (value) == NOP_EXPR)
340 value = TREE_OPERAND (value, 0);
341 my_friendly_assert (TREE_CODE (type) == PARM_DECL, 242);
342 type = TREE_TYPE (type);
343 switch (TREE_CODE (type))
348 my_friendly_assert (TREE_CODE (value) == INTEGER_CST, 243);
349 if (TYPE_PRECISION (value) == 2 * HOST_BITS_PER_WIDE_INT)
351 if (tree_int_cst_lt (value, integer_zero_node))
354 value = build_int_2 (~ TREE_INT_CST_LOW (value),
355 - TREE_INT_CST_HIGH (value));
357 if (TREE_INT_CST_HIGH (value)
358 != (TREE_INT_CST_LOW (value) >> (HOST_BITS_PER_WIDE_INT - 1)))
360 /* need to print a DImode value in decimal */
361 sorry ("conversion of long long as PT parameter");
363 /* else fall through to print in smaller mode */
365 /* Wordsize or smaller */
366 icat (TREE_INT_CST_LOW (value));
369 #ifndef REAL_IS_NOT_DOUBLE
373 char *bufp = digit_buffer;
374 extern char *index ();
376 my_friendly_assert (TREE_CODE (value) == REAL_CST, 244);
377 val = TREE_REAL_CST (value);
383 sprintf (bufp, "%e", val);
384 bufp = (char *) index (bufp, 'e');
386 strcat (digit_buffer, "e0");
412 OB_PUTCP (digit_buffer);
417 value = TREE_OPERAND (value, 0);
418 if (TREE_CODE (value) == VAR_DECL)
420 my_friendly_assert (DECL_NAME (value) != 0, 245);
421 build_overload_identifier (DECL_NAME (value));
424 else if (TREE_CODE (value) == FUNCTION_DECL)
426 my_friendly_assert (DECL_NAME (value) != 0, 246);
427 build_overload_identifier (DECL_NAME (value));
431 my_friendly_abort (71);
432 break; /* not really needed */
435 sorry ("conversion of %s as template parameter",
436 tree_code_name [(int) TREE_CODE (type)]);
437 my_friendly_abort (72);
442 build_overload_identifier (name)
445 if (IDENTIFIER_TEMPLATE (name))
447 tree template, parmlist, arglist, tname;
449 template = IDENTIFIER_TEMPLATE (name);
450 arglist = TREE_VALUE (template);
451 template = TREE_PURPOSE (template);
452 tname = DECL_NAME (template);
453 parmlist = DECL_ARGUMENTS (template);
454 nparms = TREE_VEC_LENGTH (parmlist);
456 icat (IDENTIFIER_LENGTH (tname));
459 for (i = 0; i < nparms; i++)
461 tree parm = TREE_VEC_ELT (parmlist, i);
462 tree arg = TREE_VEC_ELT (arglist, i);
463 if (TREE_CODE (parm) == IDENTIFIER_NODE)
465 /* This parameter is a type. */
467 build_overload_name (arg, 0, 0);
471 /* It's a PARM_DECL. */
472 build_overload_name (TREE_TYPE (parm), 0, 0);
473 build_overload_value (parm, arg);
479 icat (IDENTIFIER_LENGTH (name));
484 /* Given a list of parameters in PARMTYPES, create an unambiguous
485 overload string. Should distinguish any type that C (or C++) can
486 distinguish. I.e., pointers to functions are treated correctly.
488 Caller must deal with whether a final `e' goes on the end or not.
490 Any default conversions must take place before this function
493 BEGIN and END control initialization and finalization of the
494 obstack where we build the string. */
497 build_overload_name (parmtypes, begin, end)
504 if (begin) OB_INIT ();
506 if ((just_one = (TREE_CODE (parmtypes) != TREE_LIST)))
508 parmtype = parmtypes;
514 parmtype = TREE_VALUE (parmtypes);
521 /* Every argument gets counted. */
522 typevec[maxtype++] = parmtype;
524 if (TREE_USED (parmtype))
526 if (! just_one && parmtype == typevec[maxtype-2])
531 flush_repeats (parmtype);
532 if (! just_one && TREE_CHAIN (parmtypes)
533 && parmtype == TREE_VALUE (TREE_CHAIN (parmtypes)))
539 while (typevec[tindex] != parmtype)
550 flush_repeats (typevec[maxtype-2]);
552 /* Only cache types which take more than one character. */
553 && (parmtype != TYPE_MAIN_VARIANT (parmtype)
554 || (TREE_CODE (parmtype) != INTEGER_TYPE
555 && TREE_CODE (parmtype) != REAL_TYPE)))
556 TREE_USED (parmtype) = 1;
559 if (TYPE_PTRMEMFUNC_P (parmtype))
560 parmtype = TYPE_PTRMEMFUNC_FN_TYPE (parmtype);
562 if (TREE_READONLY (parmtype))
564 if (TREE_CODE (parmtype) == INTEGER_TYPE
565 && TYPE_MAIN_VARIANT (parmtype) == unsigned_type (TYPE_MAIN_VARIANT (parmtype)))
567 if (TYPE_VOLATILE (parmtype))
570 switch (TREE_CODE (parmtype))
574 build_overload_name (TYPE_OFFSET_BASETYPE (parmtype), 0, 0);
576 build_overload_name (TREE_TYPE (parmtype), 0, 0);
584 #if PARM_CAN_BE_ARRAY_TYPE
589 if (TYPE_DOMAIN (parmtype) == NULL_TREE)
591 error ("parameter type with unspecified array bounds invalid");
596 length = array_type_nelts (parmtype);
597 if (TREE_CODE (length) == INTEGER_CST)
598 icat (TREE_INT_CST_LOW (length) + 1);
611 build_overload_name (TREE_TYPE (parmtype), 0, 0);
617 tree firstarg = TYPE_ARG_TYPES (parmtype);
618 /* Otherwise have to implement reentrant typevecs,
619 unmark and remark types, etc. */
620 int old_nofold = nofold;
624 flush_repeats (typevec[maxtype-1]);
626 /* @@ It may be possible to pass a function type in
627 which is not preceded by a 'P'. */
628 if (TREE_CODE (parmtype) == FUNCTION_TYPE)
631 if (firstarg == NULL_TREE)
633 else if (firstarg == void_list_node)
636 build_overload_name (firstarg, 0, 0);
640 int constp = TYPE_READONLY (TREE_TYPE (TREE_VALUE (firstarg)));
641 int volatilep = TYPE_VOLATILE (TREE_TYPE (TREE_VALUE (firstarg)));
643 firstarg = TREE_CHAIN (firstarg);
645 build_overload_name (TYPE_METHOD_BASETYPE (parmtype), 0, 0);
651 /* For cfront 2.0 compatibility. */
654 if (firstarg == NULL_TREE)
656 else if (firstarg == void_list_node)
659 build_overload_name (firstarg, 0, 0);
662 /* Separate args from return type. */
664 build_overload_name (TREE_TYPE (parmtype), 0, 0);
670 parmtype = TYPE_MAIN_VARIANT (parmtype);
671 if (parmtype == integer_type_node
672 || parmtype == unsigned_type_node)
674 else if (parmtype == long_integer_type_node
675 || parmtype == long_unsigned_type_node)
677 else if (parmtype == short_integer_type_node
678 || parmtype == short_unsigned_type_node)
680 else if (parmtype == signed_char_type_node)
685 else if (parmtype == char_type_node
686 || parmtype == unsigned_char_type_node)
688 else if (parmtype == wchar_type_node)
690 else if (parmtype == long_long_integer_type_node
691 || parmtype == long_long_unsigned_type_node)
694 /* it would seem there is no way to enter these in source code,
696 else if (parmtype == long_long_long_integer_type_node
697 || parmtype == long_long_long_unsigned_type_node)
701 my_friendly_abort (73);
705 parmtype = TYPE_MAIN_VARIANT (parmtype);
706 if (parmtype == long_double_type_node)
708 else if (parmtype == double_type_node)
710 else if (parmtype == float_type_node)
712 else my_friendly_abort (74);
719 extern tree void_list_node;
721 /* See if anybody is wasting memory. */
722 my_friendly_assert (parmtypes == void_list_node, 247);
724 /* This is the end of a parameter list. */
725 if (end) OB_FINISH ();
726 return (char *)obstack_base (&scratch_obstack);
731 case ERROR_MARK: /* not right, but nothing is anyway */
734 /* have to do these */
738 /* Make this type signature look incompatible
745 tree name = TYPE_NAME (parmtype);
748 if (TREE_CODE (name) == TYPE_DECL)
751 while (DECL_CONTEXT (context))
754 context = DECL_CONTEXT (context);
755 if (TREE_CODE_CLASS (TREE_CODE (context)) == 't')
756 context = TYPE_NAME (context);
758 name = DECL_NAME (name);
760 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 248);
769 build_overload_nested_name (TYPE_NAME (parmtype));
772 build_overload_identifier (name);
777 /* This will take some work. */
781 case TEMPLATE_TYPE_PARM:
782 case TEMPLATE_CONST_PARM:
783 case UNINSTANTIATED_P_TYPE:
784 /* We don't ever want this output, but it's inconvenient not to
785 be able to build the string. This should cause assembler
786 errors we'll notice. */
789 sprintf (digit_buffer, " *%d", n++);
790 OB_PUTCP (digit_buffer);
795 my_friendly_abort (75);
800 parmtypes = TREE_CHAIN (parmtypes);
805 flush_repeats (typevec[maxtype-1]);
807 /* To get here, parms must end with `...'. */
811 if (end) OB_FINISH ();
812 return (char *)obstack_base (&scratch_obstack);
815 /* Generate an identifier that encodes the (ANSI) exception TYPE. */
817 /* This should be part of `ansi_opname', or at least be defined by the std. */
818 #define EXCEPTION_NAME_PREFIX "__ex"
819 #define EXCEPTION_NAME_LENGTH 4
822 cplus_exception_name (type)
826 OB_PUTS (EXCEPTION_NAME_PREFIX);
827 return get_identifier (build_overload_name (type, 0, 1));
830 /* Change the name of a function definition so that it may be
831 overloaded. NAME is the name of the function to overload,
832 PARMS is the parameter list (which determines what name the
833 final function obtains).
835 FOR_METHOD is 1 if this overload is being performed
836 for a method, rather than a function type. It is 2 if
837 this overload is being performed for a constructor. */
839 build_decl_overload (dname, parms, for_method)
844 char *name = IDENTIFIER_POINTER (dname);
846 /* member operators new and delete look like methods at this point. */
847 if (! for_method && parms != NULL_TREE && TREE_CODE (parms) == TREE_LIST)
849 if (TREE_VALUE (parms) == sizetype
850 && TREE_CHAIN (parms) == void_list_node)
852 if (dname == ansi_opname[(int) NEW_EXPR])
853 return get_identifier ("__builtin_new");
854 else if (dname == ansi_opname[(int) VEC_NEW_EXPR])
855 return get_identifier ("__builtin_vec_new");
857 else if (dname == ansi_opname[(int) DELETE_EXPR])
858 return get_identifier ("__builtin_delete");
859 else if (dname == ansi_opname[(int) VEC_DELETE_EXPR])
860 return get_identifier ("__builtin_vec_delete");
866 /* Otherwise, we can divine that this is a constructor,
867 and figure out its name without any extra encoding. */
873 /* We can get away without doing this. */
877 tree this_type = TREE_VALUE (parms);
879 if (TREE_CODE (this_type) == RECORD_TYPE) /* a signature pointer */
880 parms = temp_tree_cons (NULL_TREE, SIGNATURE_TYPE (this_type),
883 parms = temp_tree_cons (NULL_TREE, TREE_TYPE (this_type),
890 if (parms == NULL_TREE)
891 OB_PUTC2 ('e', '\0');
892 else if (parms == void_list_node)
893 OB_PUTC2 ('v', '\0');
896 ALLOCATE_TYPEVEC (parms);
900 build_overload_name (TREE_VALUE (parms), 0, 0);
902 typevec[maxtype++] = TREE_VALUE (parms);
903 TREE_USED (TREE_VALUE (parms)) = 1;
905 if (TREE_CHAIN (parms))
906 build_overload_name (TREE_CHAIN (parms), 0, 1);
908 OB_PUTC2 ('e', '\0');
911 build_overload_name (parms, 0, 1);
912 DEALLOCATE_TYPEVEC (parms);
915 tree n = get_identifier (obstack_base (&scratch_obstack));
916 if (IDENTIFIER_OPNAME_P (dname))
917 IDENTIFIER_OPNAME_P (n) = 1;
922 /* Build an overload name for the type expression TYPE. */
924 build_typename_overload (type)
930 OB_PUTID (ansi_opname[(int) TYPE_EXPR]);
932 build_overload_name (type, 0, 1);
933 id = get_identifier (obstack_base (&scratch_obstack));
934 IDENTIFIER_OPNAME_P (id) = 1;
935 IDENTIFIER_GLOBAL_VALUE (id) = TYPE_NAME (type);
936 TREE_TYPE (id) = type;
940 #ifndef NO_DOLLAR_IN_LABEL
941 #define T_DESC_FORMAT "TD$"
942 #define I_DESC_FORMAT "ID$"
943 #define M_DESC_FORMAT "MD$"
945 #if !defined(NO_DOT_IN_LABEL)
946 #define T_DESC_FORMAT "TD."
947 #define I_DESC_FORMAT "ID."
948 #define M_DESC_FORMAT "MD."
950 #define T_DESC_FORMAT "__t_desc_"
951 #define I_DESC_FORMAT "__i_desc_"
952 #define M_DESC_FORMAT "__m_desc_"
956 /* Build an overload name for the type expression TYPE. */
958 build_t_desc_overload (type)
962 OB_PUTS (T_DESC_FORMAT);
966 /* Use a different format if the type isn't defined yet. */
967 if (TYPE_SIZE (type) == NULL_TREE)
972 for (p = tname; *p; p++)
978 /* If there's no change, we have an inappropriate T_DESC_FORMAT. */
979 my_friendly_assert (changed != 0, 249);
983 build_overload_name (type, 0, 1);
984 return get_identifier (obstack_base (&scratch_obstack));
987 /* Top-level interface to explicit overload requests. Allow NAME
988 to be overloaded. Error if NAME is already declared for the current
989 scope. Warning if function is redundantly overloaded. */
992 declare_overloaded (name)
995 #ifdef NO_AUTO_OVERLOAD
996 if (is_overloaded (name))
997 warning ("function `%s' already declared overloaded",
998 IDENTIFIER_POINTER (name));
999 else if (IDENTIFIER_GLOBAL_VALUE (name))
1000 error ("overloading function `%s' that is already defined",
1001 IDENTIFIER_POINTER (name));
1004 TREE_OVERLOADED (name) = 1;
1005 IDENTIFIER_GLOBAL_VALUE (name) = build_tree_list (name, NULL_TREE);
1006 TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)) = unknown_type_node;
1009 if (current_lang_name == lang_name_cplusplus)
1012 warning ("functions are implicitly overloaded in C++");
1014 else if (current_lang_name == lang_name_c)
1015 error ("overloading function `%s' cannot be done in C language context");
1017 my_friendly_abort (76);
1021 #ifdef NO_AUTO_OVERLOAD
1022 /* Check to see if NAME is overloaded. For first approximation,
1023 check to see if its TREE_OVERLOADED is set. This is used on
1024 IDENTIFIER nodes. */
1026 is_overloaded (name)
1030 return (TREE_OVERLOADED (name)
1031 && (! IDENTIFIER_CLASS_VALUE (name) || current_class_type == 0)
1032 && ! IDENTIFIER_LOCAL_VALUE (name));
1036 /* Given a tree_code CODE, and some arguments (at least one),
1037 attempt to use an overloaded operator on the arguments.
1039 For unary operators, only the first argument need be checked.
1040 For binary operators, both arguments may need to be checked.
1042 Member functions can convert class references to class pointers,
1043 for one-level deep indirection. More than that is not supported.
1044 Operators [](), ()(), and ->() must be member functions.
1046 We call function call building calls with LOOKUP_COMPLAIN if they
1047 are our only hope. This is true when we see a vanilla operator
1048 applied to something of aggregate type. If this fails, we are free
1049 to return `error_mark_node', because we will have reported the
1052 Operators NEW and DELETE overload in funny ways: operator new takes
1053 a single `size' parameter, and operator delete takes a pointer to the
1054 storage being deleted. When overloading these operators, success is
1055 assumed. If there is a failure, report an error message and return
1056 `error_mark_node'. */
1060 build_opfncall (code, flags, xarg1, xarg2, arg3)
1061 enum tree_code code;
1063 tree xarg1, xarg2, arg3;
1067 tree type1, type2, fnname;
1068 tree fields1 = 0, parms = 0;
1071 int binary_is_unary;
1073 if (xarg1 == error_mark_node)
1074 return error_mark_node;
1076 if (code == COND_EXPR)
1078 if (TREE_CODE (xarg2) == ERROR_MARK
1079 || TREE_CODE (arg3) == ERROR_MARK)
1080 return error_mark_node;
1082 if (code == COMPONENT_REF)
1083 if (TREE_CODE (TREE_TYPE (xarg1)) == POINTER_TYPE)
1086 /* First, see if we can work with the first argument */
1087 type1 = TREE_TYPE (xarg1);
1089 /* Some tree codes have length > 1, but we really only want to
1090 overload them if their first argument has a user defined type. */
1093 case PREINCREMENT_EXPR:
1094 case PREDECREMENT_EXPR:
1095 case POSTINCREMENT_EXPR:
1096 case POSTDECREMENT_EXPR:
1098 binary_is_unary = 1;
1102 /* ARRAY_REFs and CALL_EXPRs must overload successfully.
1103 If they do not, return error_mark_node instead of NULL_TREE. */
1105 if (xarg2 == error_mark_node)
1106 return error_mark_node;
1108 rval = error_mark_node;
1109 binary_is_unary = 0;
1116 tree args = tree_cons (NULL_TREE, xarg2, arg3);
1117 fnname = ansi_opname[(int) code];
1118 if (flags & LOOKUP_GLOBAL)
1119 return build_overload_call (fnname, args, flags & LOOKUP_COMPLAIN,
1120 (struct candidate *)0);
1122 rval = build_method_call
1123 (build_indirect_ref (build1 (NOP_EXPR, xarg1, error_mark_node),
1125 fnname, args, NULL_TREE, flags);
1126 if (rval == error_mark_node)
1127 /* User might declare fancy operator new, but invoke it
1128 like standard one. */
1131 TREE_TYPE (rval) = xarg1;
1132 TREE_CALLS_NEW (rval) = 1;
1137 case VEC_DELETE_EXPR:
1140 fnname = ansi_opname[(int) code];
1141 if (flags & LOOKUP_GLOBAL)
1142 return build_overload_call (fnname,
1143 build_tree_list (NULL_TREE, xarg1),
1144 flags & LOOKUP_COMPLAIN,
1145 (struct candidate *)0);
1147 rval = build_method_call
1148 (build_indirect_ref (build1 (NOP_EXPR, TREE_TYPE (xarg1),
1151 fnname, tree_cons (NULL_TREE, xarg1,
1152 build_tree_list (NULL_TREE, xarg2)),
1154 /* This happens when the user mis-declares `operator delete'.
1155 Should now be impossible. */
1156 my_friendly_assert (rval != error_mark_node, 250);
1157 TREE_TYPE (rval) = void_type_node;
1163 binary_is_unary = 0;
1164 try_second = tree_code_length [(int) code] == 2;
1165 if (try_second && xarg2 == error_mark_node)
1166 return error_mark_node;
1170 if (try_second && xarg2 == error_mark_node)
1171 return error_mark_node;
1173 /* What ever it was, we do not know how to deal with it. */
1174 if (type1 == NULL_TREE)
1177 if (TREE_CODE (type1) == OFFSET_TYPE)
1178 type1 = TREE_TYPE (type1);
1180 if (TREE_CODE (type1) == REFERENCE_TYPE)
1182 arg1 = convert_from_reference (xarg1);
1183 type1 = TREE_TYPE (arg1);
1190 if (!IS_AGGR_TYPE (type1) || TYPE_PTRMEMFUNC_P (type1))
1192 /* Try to fail. First, fail if unary */
1195 /* Second, see if second argument is non-aggregate. */
1196 type2 = TREE_TYPE (xarg2);
1197 if (TREE_CODE (type2) == OFFSET_TYPE)
1198 type2 = TREE_TYPE (type2);
1199 if (TREE_CODE (type2) == REFERENCE_TYPE)
1201 arg2 = convert_from_reference (xarg2);
1202 type2 = TREE_TYPE (arg2);
1209 if (!IS_AGGR_TYPE (type2))
1216 /* First arg may succeed; see whether second should. */
1217 type2 = TREE_TYPE (xarg2);
1218 if (TREE_CODE (type2) == OFFSET_TYPE)
1219 type2 = TREE_TYPE (type2);
1220 if (TREE_CODE (type2) == REFERENCE_TYPE)
1222 arg2 = convert_from_reference (xarg2);
1223 type2 = TREE_TYPE (arg2);
1230 if (! IS_AGGR_TYPE (type2))
1234 if (type1 == unknown_type_node
1235 || (try_second && TREE_TYPE (xarg2) == unknown_type_node))
1237 /* This will not be implemented in the foreseeable future. */
1241 if (code == MODIFY_EXPR)
1242 fnname = ansi_assopname[(int) TREE_CODE (arg3)];
1244 fnname = ansi_opname[(int) code];
1246 global_fn = lookup_name_nonclass (fnname);
1248 /* This is the last point where we will accept failure. This
1249 may be too eager if we wish an overloaded operator not to match,
1250 but would rather a normal operator be called on a type-converted
1253 if (IS_AGGR_TYPE (type1))
1255 fields1 = lookup_fnfields (TYPE_BINFO (type1), fnname, 0);
1256 /* ARM $13.4.7, prefix/postfix ++/--. */
1257 if (code == POSTINCREMENT_EXPR || code == POSTDECREMENT_EXPR)
1259 xarg2 = integer_zero_node;
1260 binary_is_unary = 0;
1265 int have_postfix = 0;
1267 /* Look for an `operator++ (int)'. If they didn't have
1268 one, then we fall back to the old way of doing things. */
1269 for (t = TREE_VALUE (fields1); t ; t = TREE_CHAIN (t))
1271 t2 = TYPE_ARG_TYPES (TREE_TYPE (t));
1272 if (TREE_CHAIN (t2) != NULL_TREE
1273 && TREE_VALUE (TREE_CHAIN (t2)) == integer_type_node)
1282 char *op = POSTINCREMENT_EXPR ? "++" : "--";
1284 /* There's probably a LOT of code in the world that
1285 relies upon this old behavior. So we'll only give this
1286 warning when we've been given -pedantic. A few
1287 releases after 2.4, we'll convert this to be a pedwarn
1288 or something else more appropriate. */
1290 warning ("no `operator%s (int)' declared for postfix `%s'",
1293 binary_is_unary = 1;
1299 if (fields1 == NULL_TREE && global_fn == NULL_TREE)
1302 /* If RVAL winds up being `error_mark_node', we will return
1303 that... There is no way that normal semantics of these
1304 operators will succeed. */
1306 /* This argument may be an uncommitted OFFSET_REF. This is
1307 the case for example when dealing with static class members
1308 which are referenced from their class name rather than
1309 from a class instance. */
1310 if (TREE_CODE (xarg1) == OFFSET_REF
1311 && TREE_CODE (TREE_OPERAND (xarg1, 1)) == VAR_DECL)
1312 xarg1 = TREE_OPERAND (xarg1, 1);
1313 if (try_second && xarg2 && TREE_CODE (xarg2) == OFFSET_REF
1314 && TREE_CODE (TREE_OPERAND (xarg2, 1)) == VAR_DECL)
1315 xarg2 = TREE_OPERAND (xarg2, 1);
1318 flags |= LOOKUP_GLOBAL;
1320 if (code == CALL_EXPR)
1322 /* This can only be a member function. */
1323 return build_method_call (xarg1, fnname, xarg2,
1324 NULL_TREE, LOOKUP_NORMAL);
1326 else if (tree_code_length[(int) code] == 1 || binary_is_unary)
1329 rval = build_method_call (xarg1, fnname, NULL_TREE, NULL_TREE, flags);
1331 else if (code == COND_EXPR)
1333 parms = tree_cons (0, xarg2, build_tree_list (NULL_TREE, arg3));
1334 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1336 else if (code == METHOD_CALL_EXPR)
1338 /* must be a member function. */
1339 parms = tree_cons (NULL_TREE, xarg2, arg3);
1340 return build_method_call (xarg1, fnname, parms, NULL_TREE,
1345 parms = build_tree_list (NULL_TREE, xarg2);
1346 rval = build_method_call (xarg1, fnname, parms, NULL_TREE, flags);
1350 parms = tree_cons (NULL_TREE, xarg1,
1351 build_tree_list (NULL_TREE, xarg2));
1352 rval = build_overload_call (fnname, parms, flags,
1353 (struct candidate *)0);
1359 /* This function takes an identifier, ID, and attempts to figure out what
1360 it means. There are a number of possible scenarios, presented in increasing
1363 1) not in a class's scope
1364 2) in class's scope, member name of the class's method
1365 3) in class's scope, but not a member name of the class
1366 4) in class's scope, member name of a class's variable
1368 NAME is $1 from the bison rule. It is an IDENTIFIER_NODE.
1369 VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1)
1370 yychar is the pending input character (suitably encoded :-).
1372 As a last ditch, try to look up the name as a label and return that
1375 Values which are declared as being of REFERENCE_TYPE are
1376 automatically dereferenced here (as a hack to make the
1377 compiler faster). */
1380 hack_identifier (value, name, yychar)
1386 if (TREE_CODE (value) == ERROR_MARK)
1388 if (current_class_name)
1390 tree fields = lookup_fnfields (TYPE_BINFO (current_class_type), name, 1);
1391 if (fields == error_mark_node)
1392 return error_mark_node;
1397 fndecl = TREE_VALUE (fields);
1398 my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251);
1399 if (DECL_CHAIN (fndecl) == NULL_TREE)
1401 warning ("methods cannot be converted to function pointers");
1406 error ("ambiguous request for method pointer `%s'",
1407 IDENTIFIER_POINTER (name));
1408 return error_mark_node;
1412 if (flag_labels_ok && IDENTIFIER_LABEL_VALUE (name))
1414 return IDENTIFIER_LABEL_VALUE (name);
1416 return error_mark_node;
1419 type = TREE_TYPE (value);
1420 if (TREE_CODE (value) == FIELD_DECL)
1422 if (current_class_decl == NULL_TREE)
1424 error ("request for member `%s' in static member function",
1425 IDENTIFIER_POINTER (DECL_NAME (value)));
1426 return error_mark_node;
1428 TREE_USED (current_class_decl) = 1;
1430 if (! ((TYPE_LANG_SPECIFIC (type)
1431 && TYPE_OVERLOADS_CALL_EXPR (type))
1432 || (TREE_CODE (type) == REFERENCE_TYPE
1433 && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
1434 && TYPE_OVERLOADS_CALL_EXPR (TREE_TYPE (type))))
1435 && TREE_CODE (type) != FUNCTION_TYPE
1436 && TREE_CODE (type) != METHOD_TYPE
1437 && !TYPE_PTRMEMFUNC_P (type)
1438 && (TREE_CODE (type) != POINTER_TYPE
1439 || (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE
1440 && TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE)))
1442 error ("component `%s' is not a method",
1443 IDENTIFIER_POINTER (name));
1444 return error_mark_node;
1446 /* Mark so that if we are in a constructor, and then find that
1447 this field was initialized by a base initializer,
1448 we can emit an error message. */
1449 TREE_USED (value) = 1;
1450 return build_component_ref (C_C_D, name, 0, 1);
1453 if (TREE_CODE (value) == TREE_LIST)
1456 while (t && TREE_CODE (t) == TREE_LIST)
1458 assemble_external (TREE_VALUE (t));
1465 assemble_external (value);
1466 TREE_USED (value) = 1;
1469 if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value))
1471 if (DECL_LANG_SPECIFIC (value)
1472 && DECL_CLASS_CONTEXT (value) != current_class_type)
1475 enum access_type access;
1476 register tree context
1477 = (TREE_CODE (value) == FUNCTION_DECL && DECL_VIRTUAL_P (value))
1478 ? DECL_CLASS_CONTEXT (value)
1479 : DECL_CONTEXT (value);
1481 get_base_distance (context, current_class_type, 0, &path);
1484 access = compute_access (path, value);
1485 if (access != access_public)
1487 if (TREE_CODE (value) == VAR_DECL)
1488 error ("static member `%s' is %s",
1489 IDENTIFIER_POINTER (name),
1490 TREE_PRIVATE (value) ? "private" :
1491 "from a private base class");
1493 error ("enum `%s' is from private base class",
1494 IDENTIFIER_POINTER (name));
1495 return error_mark_node;
1501 if (TREE_CODE (value) == TREE_LIST && TREE_NONLOCAL_FLAG (value))
1505 error ("request for member `%s' is ambiguous in multiple inheritance lattice",
1506 IDENTIFIER_POINTER (name));
1507 return error_mark_node;
1513 if (TREE_CODE (type) == REFERENCE_TYPE)
1515 my_friendly_assert (TREE_CODE (value) == VAR_DECL
1516 || TREE_CODE (value) == PARM_DECL
1517 || TREE_CODE (value) == RESULT_DECL, 252);
1518 if (DECL_REFERENCE_SLOT (value))
1519 return DECL_REFERENCE_SLOT (value);
1526 /* Given an object OF, and a type conversion operator COMPONENT
1527 build a call to the conversion operator, if a call is requested,
1528 or return the address (as a pointer to member function) if one is not.
1530 OF can be a TYPE_DECL or any kind of datum that would normally
1531 be passed to `build_component_ref'. It may also be NULL_TREE,
1532 in which case `current_class_type' and `current_class_decl'
1533 provide default values.
1535 BASETYPE_PATH, if non-null, is the path of basetypes
1536 to go through before we get the the instance of interest.
1538 PROTECT says whether we apply C++ scoping rules or not. */
1540 build_component_type_expr (of, component, basetype_path, protect)
1541 tree of, component, basetype_path;
1544 tree cname = NULL_TREE;
1547 int flags = protect ? LOOKUP_NORMAL : LOOKUP_COMPLAIN;
1550 my_friendly_assert (IS_AGGR_TYPE (TREE_TYPE (of)), 253);
1551 my_friendly_assert (TREE_CODE (component) == TYPE_EXPR, 254);
1553 tmp = TREE_OPERAND (component, 0);
1558 switch (TREE_CODE (tmp))
1562 TREE_OPERAND (last, 0) = TREE_OPERAND (tmp, 0);
1564 TREE_OPERAND (component, 0) = TREE_OPERAND (tmp, 0);
1566 last = groktypename (build_tree_list (TREE_TYPE (component),
1567 TREE_OPERAND (component, 0)));
1568 name = build_typename_overload (last);
1569 TREE_TYPE (name) = last;
1571 if (TREE_OPERAND (tmp, 0)
1572 && TREE_OPERAND (tmp, 0) != void_list_node)
1574 cp_error ("`operator %T' requires empty parameter list", last);
1575 TREE_OPERAND (tmp, 0) = NULL_TREE;
1578 if (of && TREE_CODE (of) != TYPE_DECL)
1579 return build_method_call (of, name, NULL_TREE, NULL_TREE, flags);
1584 if (current_class_decl == NULL_TREE)
1586 cp_error ("object required for `operator %T' call",
1588 return error_mark_node;
1591 this_this = convert_pointer_to (TREE_TYPE (of),
1592 current_class_decl);
1593 this_this = build_indirect_ref (this_this, NULL_PTR);
1594 return build_method_call (this_this, name, NULL_TREE,
1595 NULL_TREE, flags | LOOKUP_NONVIRTUAL);
1597 else if (current_class_decl)
1598 return build_method_call (tmp, name, NULL_TREE, NULL_TREE, flags);
1600 cp_error ("object required for `operator %T' call",
1602 return error_mark_node;
1610 my_friendly_assert (cname == 0, 255);
1611 cname = TREE_OPERAND (tmp, 0);
1612 tmp = TREE_OPERAND (tmp, 1);
1616 my_friendly_abort (77);
1619 tmp = TREE_OPERAND (tmp, 0);
1622 last = groktypename (build_tree_list (TREE_TYPE (component), TREE_OPERAND (component, 0)));
1623 name = build_typename_overload (last);
1624 TREE_TYPE (name) = last;
1625 if (of && TREE_CODE (of) == TYPE_DECL)
1627 if (cname == NULL_TREE)
1629 cname = DECL_NAME (of);
1632 else my_friendly_assert (cname == DECL_NAME (of), 256);
1639 if (current_class_decl == NULL_TREE)
1641 cp_error ("object required for `operator %T' call",
1643 return error_mark_node;
1646 this_this = convert_pointer_to (TREE_TYPE (of), current_class_decl);
1647 return build_component_ref (this_this, name, 0, protect);
1650 return build_offset_ref (cname, name);
1651 else if (current_class_name)
1652 return build_offset_ref (current_class_name, name);
1654 cp_error ("object required for `operator %T' member reference",
1656 return error_mark_node;
1661 thunk_printable_name (decl)
1664 return "<thunk function>";
1668 make_thunk (function, delta)
1675 static int thunk_number = 0;
1677 if (TREE_CODE (function) != ADDR_EXPR)
1679 func_decl = TREE_OPERAND (function, 0);
1680 if (TREE_CODE (func_decl) != FUNCTION_DECL)
1682 sprintf (buffer, "__thunk_%d_%d", -delta, thunk_number++);
1683 thunk = build_decl (THUNK_DECL, get_identifier (buffer),
1684 TREE_TYPE (func_decl));
1686 = build_decl (RESULT_DECL, NULL_TREE, TREE_TYPE (vtable_entry_type));
1687 make_function_rtl (thunk);
1688 DECL_INITIAL (thunk) = function;
1689 THUNK_DELTA (thunk) = delta;
1694 emit_thunk (thunk_fndecl)
1701 struct args_size stack_args_size;
1702 tree function = TREE_OPERAND (DECL_INITIAL (thunk_fndecl), 0);
1703 int delta = THUNK_DELTA (thunk_fndecl);
1706 extern int current_call_is_indirect; /* Needed for (at least) HPPA. */
1708 /* Used to remember which regs we need to emit a USE rtx for. */
1709 rtx need_use[FIRST_PSEUDO_REGISTER];
1710 int need_use_count = 0;
1712 /* rtx for the 'this' parameter. */
1713 rtx this_rtx = 0, this_reg_rtx = 0, fixed_this_rtx;
1715 char *(*save_decl_printable_name) () = decl_printable_name;
1716 /* Data on reg parms scanned so far. */
1717 CUMULATIVE_ARGS args_so_far;
1719 if (TREE_ASM_WRITTEN (thunk_fndecl))
1722 decl_printable_name = thunk_printable_name;
1723 if (current_function_decl)
1725 current_function_decl = thunk_fndecl;
1726 init_function_start (thunk_fndecl, input_filename, lineno);
1728 expand_start_bindings (1);
1730 /* Start updating where the next arg would go. */
1731 INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (function), NULL_RTX);
1732 stack_args_size.constant = 0;
1733 stack_args_size.var = 0;
1734 /* SETUP for possible structure return address FIXME */
1736 /* Now look through all the parameters, make sure that we
1737 don't clobber any registers used for parameters.
1738 Also, pick up an rtx for the first "this" parameter. */
1739 for (argp = TYPE_ARG_TYPES (TREE_TYPE (function));
1741 argp = TREE_CHAIN (argp))
1744 tree passed_type = TREE_VALUE (argp);
1745 register rtx entry_parm;
1746 int named = 1; /* FIXME */
1747 struct args_size stack_offset;
1748 struct args_size arg_size;
1750 if (passed_type == void_type_node)
1753 if ((TREE_CODE (TYPE_SIZE (passed_type)) != INTEGER_CST
1754 && contains_placeholder_p (TYPE_SIZE (passed_type)))
1755 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
1756 || FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far,
1757 TYPE_MODE (passed_type),
1761 passed_type = build_pointer_type (passed_type);
1763 entry_parm = FUNCTION_ARG (args_so_far,
1764 TYPE_MODE (passed_type),
1767 if (entry_parm != 0)
1768 need_use[need_use_count++] = entry_parm;
1770 locate_and_pad_parm (TYPE_MODE (passed_type), passed_type,
1771 #ifdef STACK_PARMS_IN_REG_PARM_AREA
1777 &stack_args_size, &stack_offset, &arg_size);
1779 /* REGNO (entry_parm);*/
1782 this_reg_rtx = entry_parm;
1785 rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
1787 rtx internal_arg_pointer, stack_parm;
1789 if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
1790 || ! (fixed_regs[ARG_POINTER_REGNUM]
1791 || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
1792 internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
1794 internal_arg_pointer = virtual_incoming_args_rtx;
1796 if (offset_rtx == const0_rtx)
1797 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1798 internal_arg_pointer);
1800 entry_parm = gen_rtx (MEM, TYPE_MODE (passed_type),
1801 gen_rtx (PLUS, Pmode,
1802 internal_arg_pointer,
1806 this_rtx = entry_parm;
1809 FUNCTION_ARG_ADVANCE (args_so_far,
1810 TYPE_MODE (passed_type),
1815 fixed_this_rtx = plus_constant (this_rtx, delta);
1816 if (this_rtx != fixed_this_rtx)
1817 emit_move_insn (this_rtx, fixed_this_rtx);
1820 emit_insn (gen_rtx (USE, VOIDmode, this_reg_rtx));
1822 emit_indirect_jump (XEXP (DECL_RTL (function), 0));
1824 while (need_use_count > 0)
1825 emit_insn (gen_rtx (USE, VOIDmode, need_use[--need_use_count]));
1827 expand_end_bindings (NULL, 1, 0);
1830 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
1832 /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
1833 Note that that may have been done above, in save_for_inline_copying.
1834 The call to resume_temporary_allocation near the end of this function
1835 goes back to the usual state of affairs. */
1837 rtl_in_current_obstack ();
1839 insns = get_insns ();
1841 /* Copy any shared structure that should not be shared. */
1843 unshare_all_rtl (insns);
1845 /* Instantiate all virtual registers. */
1847 instantiate_virtual_regs (current_function_decl, get_insns ());
1849 /* We are no longer anticipating cse in this function, at least. */
1851 cse_not_expected = 1;
1853 /* Now we choose between stupid (pcc-like) register allocation
1854 (if we got the -noreg switch and not -opt)
1855 and smart register allocation. */
1857 if (optimize > 0) /* Stupid allocation probably won't work */
1858 obey_regdecls = 0; /* if optimizations being done. */
1862 regclass (insns, max_reg_num ());
1865 stupid_life_analysis (insns, max_reg_num (), NULL);
1866 failure = reload (insns, 0, NULL);
1870 /* Do control and data flow analysis,
1871 and write some of the results to dump file. */
1873 flow_analysis (insns, max_reg_num (), NULL);
1875 failure = global_alloc (NULL);
1878 reload_completed = 1;
1880 #ifdef LEAF_REGISTERS
1882 if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
1886 /* If a machine dependent reorganization is needed, call it. */
1887 #ifdef MACHINE_DEPENDENT_REORG
1888 MACHINE_DEPENDENT_REORG (insns);
1891 /* Now turn the rtl into assembler code. */
1894 char *fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
1895 assemble_start_function (thunk_fndecl, fnname);
1896 final (insns, asm_out_file, optimize, 0);
1897 assemble_end_function (thunk_fndecl, fnname);
1900 exit_rest_of_compilation:
1902 reload_completed = 0;
1904 /* Cancel the effect of rtl_in_current_obstack. */
1906 resume_temporary_allocation ();
1908 decl_printable_name = save_decl_printable_name;
1909 current_function_decl = 0;