]> gcc.gnu.org Git - gcc.git/blame - gcc/cp/method.c
alpha.c (alpha_init_builtins): Use type_for_mode langhook to get a DImode integer...
[gcc.git] / gcc / cp / method.c
CommitLineData
8d08fdba
MS
1/* Handle the hair of processing (but not expanding) inline functions.
2 Also manage function and variable name overloading.
c8094d83 3 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
0a57b6af 4 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
8d08fdba
MS
5 Contributed by Michael Tiemann (tiemann@cygnus.com)
6
f5adbb8d 7This file is part of GCC.
c8094d83 8
f5adbb8d 9GCC is free software; you can redistribute it and/or modify
8d08fdba
MS
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2, or (at your option)
12any later version.
13
f5adbb8d 14GCC is distributed in the hope that it will be useful,
8d08fdba
MS
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
f5adbb8d 20along with GCC; see the file COPYING. If not, write to
1788952f
KC
21the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22Boston, MA 02110-1301, USA. */
8d08fdba
MS
23
24
8d08fdba 25/* Handle method declarations. */
8d08fdba 26#include "config.h"
e817b5e3 27#include "system.h"
4977bab6
ZW
28#include "coretypes.h"
29#include "tm.h"
8d08fdba
MS
30#include "tree.h"
31#include "cp-tree.h"
8926095f
MS
32#include "rtl.h"
33#include "expr.h"
34#include "output.h"
8926095f 35#include "flags.h"
54f92bfb 36#include "toplev.h"
b1afd7f4 37#include "tm_p.h"
483ab821 38#include "target.h"
e21aff8a 39#include "tree-pass.h"
3e3935a9 40#include "diagnostic.h"
8d08fdba 41
669ec2b4
JM
42/* Various flags to control the mangling process. */
43
44enum mangling_flags
45{
46 /* No flags. */
47 mf_none = 0,
48 /* The thing we are presently mangling is part of a template type,
49 rather than a fully instantiated type. Therefore, we may see
50 complex expressions where we would normally expect to see a
51 simple integer constant. */
52 mf_maybe_uninstantiated = 1,
53 /* When mangling a numeric value, use the form `_XX_' (instead of
54 just `XX') if the value has more than one digit. */
de94b46c 55 mf_use_underscores_around_value = 2
669ec2b4
JM
56};
57
58typedef enum mangling_flags mangling_flags;
59
4977bab6
ZW
60static tree thunk_adjust (tree, bool, HOST_WIDE_INT, tree);
61static void do_build_assign_ref (tree);
62static void do_build_copy_constructor (tree);
63static tree synthesize_exception_spec (tree, tree (*) (tree, void *), void *);
64static tree locate_dtor (tree, void *);
65static tree locate_ctor (tree, void *);
66static tree locate_copy (tree, void *);
d46c570d 67static tree make_alias_for_thunk (tree);
669ec2b4 68
669ec2b4
JM
69/* Called once to initialize method.c. */
70
71void
4977bab6 72init_method (void)
669ec2b4 73{
1f84ec23 74 init_mangle ();
669ec2b4 75}
8926095f 76\f
4977bab6
ZW
77/* Return a this or result adjusting thunk to FUNCTION. THIS_ADJUSTING
78 indicates whether it is a this or result adjusting thunk.
79 FIXED_OFFSET and VIRTUAL_OFFSET indicate how to do the adjustment
80 (see thunk_adjust). VIRTUAL_OFFSET can be NULL, but FIXED_OFFSET
81 never is. VIRTUAL_OFFSET is the /index/ into the vtable for this
82 adjusting thunks, we scale it to a byte offset. For covariant
83 thunks VIRTUAL_OFFSET is the virtual binfo. You must post process
84 the returned thunk with finish_thunk. */
1f6e1acc 85
8926095f 86tree
4977bab6
ZW
87make_thunk (tree function, bool this_adjusting,
88 tree fixed_offset, tree virtual_offset)
8926095f 89{
31f8e4f3 90 HOST_WIDE_INT d;
4977bab6 91 tree thunk;
c8094d83 92
50bc768d 93 gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
9bcb9aae 94 /* We can have this thunks to covariant thunks, but not vice versa. */
50bc768d
NS
95 gcc_assert (!DECL_THIS_THUNK_P (function));
96 gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting);
c8094d83 97
4977bab6
ZW
98 /* Scale the VIRTUAL_OFFSET to be in terms of bytes. */
99 if (this_adjusting && virtual_offset)
c8094d83 100 virtual_offset
31f8e4f3 101 = size_binop (MULT_EXPR,
0cbd7506
MS
102 virtual_offset,
103 convert (ssizetype,
104 TYPE_SIZE_UNIT (vtable_entry_type)));
c8094d83 105
4977bab6 106 d = tree_low_cst (fixed_offset, 0);
c8094d83 107
4977bab6
ZW
108 /* See if we already have the thunk in question. For this_adjusting
109 thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
9bcb9aae 110 will be a BINFO. */
bb5e8a7f 111 for (thunk = DECL_THUNKS (function); thunk; thunk = TREE_CHAIN (thunk))
e00853fd
NS
112 if (DECL_THIS_THUNK_P (thunk) == this_adjusting
113 && THUNK_FIXED_OFFSET (thunk) == d
114 && !virtual_offset == !THUNK_VIRTUAL_OFFSET (thunk)
115 && (!virtual_offset
116 || (this_adjusting
117 ? tree_int_cst_equal (THUNK_VIRTUAL_OFFSET (thunk),
118 virtual_offset)
119 : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
120 return thunk;
c8094d83 121
bb5e8a7f
MM
122 /* All thunks must be created before FUNCTION is actually emitted;
123 the ABI requires that all thunks be emitted together with the
124 function to which they transfer control. */
50bc768d 125 gcc_assert (!TREE_ASM_WRITTEN (function));
90d46c28
NS
126 /* Likewise, we can only be adding thunks to a function declared in
127 the class currently being laid out. */
50bc768d
NS
128 gcc_assert (TYPE_SIZE (DECL_CONTEXT (function))
129 && TYPE_BEING_DEFINED (DECL_CONTEXT (function)));
bb5e8a7f 130
4977bab6 131 thunk = build_decl (FUNCTION_DECL, NULL_TREE, TREE_TYPE (function));
bb5e8a7f 132 DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
07fa4878 133 cxx_dup_lang_specific_decl (thunk);
bb885938 134 DECL_THUNKS (thunk) = NULL_TREE;
c8094d83 135
bb5e8a7f
MM
136 DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
137 TREE_READONLY (thunk) = TREE_READONLY (function);
138 TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
139 TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
140 if (flag_weak)
141 comdat_linkage (thunk);
4977bab6 142 SET_DECL_THUNK_P (thunk, this_adjusting);
07fa4878
NS
143 THUNK_TARGET (thunk) = function;
144 THUNK_FIXED_OFFSET (thunk) = d;
4977bab6 145 THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
e00853fd 146 THUNK_ALIAS (thunk) = NULL_TREE;
c8094d83 147
bb5e8a7f
MM
148 /* The thunk itself is not a constructor or destructor, even if
149 the thing it is thunking to is. */
150 DECL_INTERFACE_KNOWN (thunk) = 1;
151 DECL_NOT_REALLY_EXTERN (thunk) = 1;
152 DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
153 DECL_DESTRUCTOR_P (thunk) = 0;
154 DECL_CONSTRUCTOR_P (thunk) = 0;
bb5e8a7f
MM
155 DECL_EXTERNAL (thunk) = 1;
156 DECL_ARTIFICIAL (thunk) = 1;
157 /* Even if this thunk is a member of a local class, we don't
158 need a static chain. */
159 DECL_NO_STATIC_CHAIN (thunk) = 1;
160 /* The THUNK is not a pending inline, even if the FUNCTION is. */
161 DECL_PENDING_INLINE_P (thunk) = 0;
eab5474f
NS
162 DECL_INLINE (thunk) = 0;
163 DECL_DECLARED_INLINE_P (thunk) = 0;
bb5e8a7f
MM
164 /* Nor has it been deferred. */
165 DECL_DEFERRED_FN (thunk) = 0;
c8094d83 166
bb5e8a7f
MM
167 /* Add it to the list of thunks associated with FUNCTION. */
168 TREE_CHAIN (thunk) = DECL_THUNKS (function);
169 DECL_THUNKS (function) = thunk;
cc600f33 170
8926095f
MS
171 return thunk;
172}
173
07fa4878 174/* Finish THUNK, a thunk decl. */
eb448459 175
8926095f 176void
07fa4878 177finish_thunk (tree thunk)
4977bab6
ZW
178{
179 tree function, name;
ce552f75 180 tree fixed_offset = ssize_int (THUNK_FIXED_OFFSET (thunk));
07fa4878
NS
181 tree virtual_offset = THUNK_VIRTUAL_OFFSET (thunk);
182
50bc768d 183 gcc_assert (!DECL_NAME (thunk) && DECL_THUNK_P (thunk));
07fa4878
NS
184 if (virtual_offset && DECL_RESULT_THUNK_P (thunk))
185 virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
186 function = THUNK_TARGET (thunk);
4977bab6 187 name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
07fa4878 188 fixed_offset, virtual_offset);
bb885938
NS
189
190 /* We can end up with declarations of (logically) different
191 covariant thunks, that do identical adjustments. The two thunks
192 will be adjusting between within different hierarchies, which
193 happen to have the same layout. We must nullify one of them to
194 refer to the other. */
195 if (DECL_RESULT_THUNK_P (thunk))
196 {
197 tree cov_probe;
198
199 for (cov_probe = DECL_THUNKS (function);
200 cov_probe; cov_probe = TREE_CHAIN (cov_probe))
201 if (DECL_NAME (cov_probe) == name)
202 {
50bc768d 203 gcc_assert (!DECL_THUNKS (thunk));
e00853fd 204 THUNK_ALIAS (thunk) = (THUNK_ALIAS (cov_probe)
bb885938
NS
205 ? THUNK_ALIAS (cov_probe) : cov_probe);
206 break;
207 }
208 }
c8094d83 209
4977bab6
ZW
210 DECL_NAME (thunk) = name;
211 SET_DECL_ASSEMBLER_NAME (thunk, name);
212}
213
214/* Adjust PTR by the constant FIXED_OFFSET, and by the vtable
215 offset indicated by VIRTUAL_OFFSET, if that is
4de8668e 216 non-null. THIS_ADJUSTING is nonzero for a this adjusting thunk and
9bcb9aae 217 zero for a result adjusting thunk. */
4977bab6
ZW
218
219static tree
220thunk_adjust (tree ptr, bool this_adjusting,
221 HOST_WIDE_INT fixed_offset, tree virtual_offset)
222{
223 if (this_adjusting)
224 /* Adjust the pointer by the constant. */
7866705a
SB
225 ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr,
226 ssize_int (fixed_offset));
4977bab6
ZW
227
228 /* If there's a virtual offset, look up that value in the vtable and
229 adjust the pointer again. */
230 if (virtual_offset)
231 {
232 tree vtable;
233
4977bab6
ZW
234 ptr = save_expr (ptr);
235 /* The vptr is always at offset zero in the object. */
236 vtable = build1 (NOP_EXPR,
c8094d83 237 build_pointer_type (build_pointer_type
4977bab6
ZW
238 (vtable_entry_type)),
239 ptr);
240 /* Form the vtable address. */
241 vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
242 /* Find the entry with the vcall offset. */
f293ce4b 243 vtable = build2 (PLUS_EXPR, TREE_TYPE (vtable), vtable, virtual_offset);
4977bab6
ZW
244 /* Get the offset itself. */
245 vtable = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (vtable)), vtable);
246 /* Adjust the `this' pointer. */
7866705a 247 ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr, vtable);
4977bab6 248 }
c8094d83 249
4977bab6
ZW
250 if (!this_adjusting)
251 /* Adjust the pointer by the constant. */
7866705a
SB
252 ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr,
253 ssize_int (fixed_offset));
4977bab6
ZW
254
255 return ptr;
256}
257
89ce1c8f
JJ
258static GTY (()) int thunk_labelno;
259
260/* Create a static alias to function. */
261
6de33afa
RH
262tree
263make_alias_for (tree function, tree newid)
89ce1c8f 264{
6de33afa 265 tree alias = build_decl (FUNCTION_DECL, newid, TREE_TYPE (function));
89ce1c8f
JJ
266 DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (function);
267 cxx_dup_lang_specific_decl (alias);
268 DECL_CONTEXT (alias) = NULL;
269 TREE_READONLY (alias) = TREE_READONLY (function);
270 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (function);
271 TREE_PUBLIC (alias) = 0;
272 DECL_INTERFACE_KNOWN (alias) = 1;
273 DECL_NOT_REALLY_EXTERN (alias) = 1;
274 DECL_THIS_STATIC (alias) = 1;
275 DECL_SAVED_FUNCTION_DATA (alias) = NULL;
276 DECL_DESTRUCTOR_P (alias) = 0;
277 DECL_CONSTRUCTOR_P (alias) = 0;
278 DECL_CLONED_FUNCTION (alias) = NULL_TREE;
279 DECL_EXTERNAL (alias) = 0;
280 DECL_ARTIFICIAL (alias) = 1;
281 DECL_NO_STATIC_CHAIN (alias) = 1;
282 DECL_PENDING_INLINE_P (alias) = 0;
283 DECL_INLINE (alias) = 0;
284 DECL_DECLARED_INLINE_P (alias) = 0;
285 DECL_DEFERRED_FN (alias) = 0;
286 DECL_USE_TEMPLATE (alias) = 0;
287 DECL_TEMPLATE_INSTANTIATED (alias) = 0;
288 DECL_TEMPLATE_INFO (alias) = NULL;
289 DECL_INITIAL (alias) = error_mark_node;
290 TREE_ADDRESSABLE (alias) = 1;
291 TREE_USED (alias) = 1;
292 SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
293 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
6de33afa
RH
294 return alias;
295}
296
297static tree
298make_alias_for_thunk (tree function)
299{
300 tree alias;
301 char buf[256];
302
303 ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
304 thunk_labelno++;
305
306 alias = make_alias_for (function, get_identifier (buf));
307
89ce1c8f
JJ
308 if (!flag_syntax_only)
309 assemble_alias (alias, DECL_ASSEMBLER_NAME (function));
6de33afa 310
89ce1c8f
JJ
311 return alias;
312}
313
4977bab6
ZW
314/* Emit the definition of a C++ multiple inheritance or covariant
315 return vtable thunk. If EMIT_P is nonzero, the thunk is emitted
316 immediately. */
317
318void
319use_thunk (tree thunk_fndecl, bool emit_p)
8926095f 320{
7a3e01c4 321 tree a, t, function, alias;
4977bab6
ZW
322 tree virtual_offset;
323 HOST_WIDE_INT fixed_offset, virtual_value;
07fa4878 324 bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
4977bab6 325
9bcb9aae 326 /* We should have called finish_thunk to give it a name. */
50bc768d 327 gcc_assert (DECL_NAME (thunk_fndecl));
8926095f 328
bb885938
NS
329 /* We should never be using an alias, always refer to the
330 aliased thunk. */
50bc768d 331 gcc_assert (!THUNK_ALIAS (thunk_fndecl));
bb885938 332
8926095f
MS
333 if (TREE_ASM_WRITTEN (thunk_fndecl))
334 return;
c8094d83 335
07fa4878
NS
336 function = THUNK_TARGET (thunk_fndecl);
337 if (DECL_RESULT (thunk_fndecl))
6462c441 338 /* We already turned this thunk into an ordinary function.
dff94ad7 339 There's no need to process this thunk again. */
6462c441
MM
340 return;
341
742f25b3
NS
342 if (DECL_THUNK_P (function))
343 /* The target is itself a thunk, process it now. */
344 use_thunk (function, emit_p);
c8094d83 345
31f8e4f3
MM
346 /* Thunks are always addressable; they only appear in vtables. */
347 TREE_ADDRESSABLE (thunk_fndecl) = 1;
a0a33927 348
31f8e4f3
MM
349 /* Figure out what function is being thunked to. It's referenced in
350 this translation unit. */
809c8c30
JM
351 TREE_ADDRESSABLE (function) = 1;
352 mark_used (function);
31f8e4f3
MM
353 if (!emit_p)
354 return;
809c8c30 355
4a77e08c
DS
356 if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function))
357 alias = make_alias_for_thunk (function);
358 else
359 alias = function;
89ce1c8f 360
4977bab6
ZW
361 fixed_offset = THUNK_FIXED_OFFSET (thunk_fndecl);
362 virtual_offset = THUNK_VIRTUAL_OFFSET (thunk_fndecl);
3961e8fe 363
07fa4878
NS
364 if (virtual_offset)
365 {
366 if (!this_adjusting)
367 virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
368 virtual_value = tree_low_cst (virtual_offset, /*pos=*/0);
50bc768d 369 gcc_assert (virtual_value);
07fa4878
NS
370 }
371 else
372 virtual_value = 0;
c8094d83 373
31f8e4f3
MM
374 /* And, if we need to emit the thunk, it's used. */
375 mark_used (thunk_fndecl);
376 /* This thunk is actually defined. */
377 DECL_EXTERNAL (thunk_fndecl) = 0;
15eb1e43
JM
378 /* The linkage of the function may have changed. FIXME in linkage
379 rewrite. */
380 TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
968b41a1 381 DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
c8094d83 382 DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
73a8adb6 383 = DECL_VISIBILITY_SPECIFIED (function);
4746cf84
MA
384 if (flag_weak && TREE_PUBLIC (thunk_fndecl))
385 comdat_linkage (thunk_fndecl);
a0128b67 386
6462c441
MM
387 if (flag_syntax_only)
388 {
389 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
390 return;
391 }
392
31f8e4f3
MM
393 push_to_top_level ();
394
4a77e08c
DS
395 if (TARGET_USE_LOCAL_THUNK_ALIAS_P (function)
396 && targetm.have_named_sections)
89ce1c8f
JJ
397 {
398 resolve_unique_section (function, 0, flag_function_sections);
399
400 if (DECL_SECTION_NAME (function) != NULL && DECL_ONE_ONLY (function))
401 {
402 resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
403
404 /* Output the thunk into the same section as function. */
405 DECL_SECTION_NAME (thunk_fndecl) = DECL_SECTION_NAME (function);
406 }
407 }
89ce1c8f 408
14691f8d
RH
409 /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
410 create one. */
411 DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
7a3e01c4
JDA
412
413 /* Set up cloned argument trees for the thunk. */
414 t = NULL_TREE;
415 for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
416 {
417 tree x = copy_node (a);
418 TREE_CHAIN (x) = t;
419 DECL_CONTEXT (x) = thunk_fndecl;
420 SET_DECL_RTL (x, NULL_RTX);
421 t = x;
422 }
423 a = nreverse (t);
424 DECL_ARGUMENTS (thunk_fndecl) = a;
425 BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
c8094d83 426
07fa4878 427 if (this_adjusting
4977bab6 428 && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
89ce1c8f 429 virtual_value, alias))
3b62f224 430 {
3cce094d 431 const char *fnname;
3b62f224 432 current_function_decl = thunk_fndecl;
3b62f224
MM
433 DECL_RESULT (thunk_fndecl)
434 = build_decl (RESULT_DECL, 0, integer_type_node);
435 fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
ee6b0296 436 init_function_start (thunk_fndecl);
3b62f224
MM
437 current_function_is_thunk = 1;
438 assemble_start_function (thunk_fndecl, fnname);
eb0424da 439
4977bab6 440 targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl,
89ce1c8f 441 fixed_offset, virtual_value, alias);
3961e8fe 442
3b62f224 443 assemble_end_function (thunk_fndecl, fnname);
8402b3e1 444 init_insn_lengths ();
3b62f224 445 current_function_decl = 0;
01d939e8 446 cfun = 0;
6462c441 447 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
3b62f224 448 }
4e7512c9 449 else
14691f8d 450 {
4977bab6
ZW
451 /* If this is a covariant thunk, or we don't have the necessary
452 code for efficient thunks, generate a thunk function that
453 just makes a call to the real function. Unfortunately, this
454 doesn't work for varargs. */
14691f8d 455
14691f8d 456 if (varargs_function_p (function))
2a13a625 457 error ("generic thunk code fails for method %q#D which uses %<...%>",
14691f8d
RH
458 function);
459
14691f8d
RH
460 DECL_RESULT (thunk_fndecl) = NULL_TREE;
461
058b15c1 462 start_preparsed_function (thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
14691f8d
RH
463 /* We don't bother with a body block for thunks. */
464
1bb2cc34 465 /* There's no need to check accessibility inside the thunk body. */
78757caa 466 push_deferring_access_checks (dk_no_check);
1bb2cc34 467
4977bab6 468 t = a;
07fa4878 469 if (this_adjusting)
4977bab6
ZW
470 t = thunk_adjust (t, /*this_adjusting=*/1,
471 fixed_offset, virtual_offset);
c8094d83 472
14691f8d
RH
473 /* Build up the call to the real function. */
474 t = tree_cons (NULL_TREE, t, NULL_TREE);
475 for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
476 t = tree_cons (NULL_TREE, a, t);
477 t = nreverse (t);
89ce1c8f 478 t = build_call (alias, t);
dd292d0a 479 CALL_FROM_THUNK_P (t) = 1;
c8094d83 480
14691f8d
RH
481 if (VOID_TYPE_P (TREE_TYPE (t)))
482 finish_expr_stmt (t);
483 else
59445d74 484 {
59445d74 485 if (!this_adjusting)
38a37714
NS
486 {
487 tree cond = NULL_TREE;
488
489 if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
490 {
491 /* If the return type is a pointer, we need to
492 protect against NULL. We know there will be an
493 adjustment, because that's why we're emitting a
494 thunk. */
495 t = save_expr (t);
496 cond = cp_convert (boolean_type_node, t);
497 }
c8094d83 498
38a37714
NS
499 t = thunk_adjust (t, /*this_adjusting=*/0,
500 fixed_offset, virtual_offset);
501 if (cond)
502 t = build3 (COND_EXPR, TREE_TYPE (t), cond, t,
503 cp_convert (TREE_TYPE (t), integer_zero_node));
504 }
831d8bd7
JM
505 if (IS_AGGR_TYPE (TREE_TYPE (t)))
506 t = build_cplus_new (TREE_TYPE (t), t);
59445d74
RH
507 finish_return_stmt (t);
508 }
14691f8d
RH
509
510 /* Since we want to emit the thunk, we explicitly mark its name as
511 referenced. */
bb9a388d 512 mark_decl_referenced (thunk_fndecl);
14691f8d
RH
513
514 /* But we don't want debugging information about it. */
515 DECL_IGNORED_P (thunk_fndecl) = 1;
516
1bb2cc34 517 /* Re-enable access control. */
78757caa 518 pop_deferring_access_checks ();
1bb2cc34 519
e21aff8a
SB
520 thunk_fndecl = finish_function (0);
521 tree_lowering_passes (thunk_fndecl);
522 expand_body (thunk_fndecl);
14691f8d 523 }
31f8e4f3
MM
524
525 pop_from_top_level ();
8926095f 526}
f376e137
MS
527\f
528/* Code for synthesizing methods which have default semantics defined. */
529
f376e137 530/* Generate code for default X(X&) constructor. */
e92cc029 531
824b9a4c 532static void
4977bab6 533do_build_copy_constructor (tree fndecl)
f376e137 534{
e0fff4b3 535 tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
f376e137 536
f376e137
MS
537 parm = convert_from_reference (parm);
538
a59ca936
JM
539 if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)
540 && is_empty_class (current_class_type))
541 /* Don't copy the padding byte; it might not have been allocated
542 if *this is a base subobject. */;
543 else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
f376e137 544 {
fd749a60 545 tree t = build2 (INIT_EXPR, void_type_node, current_class_ref, parm);
f1dedc31 546 finish_expr_stmt (t);
f376e137
MS
547 }
548 else
549 {
550 tree fields = TYPE_FIELDS (current_class_type);
fd74ca0b 551 tree member_init_list = NULL_TREE;
89d684bb 552 int cvquals = cp_type_quals (TREE_TYPE (parm));
f376e137 553 int i;
fa743e8c 554 tree binfo, base_binfo;
d4e6fecb 555 VEC(tree,gc) *vbases;
f376e137 556
713ccd0c
NS
557 /* Initialize all the base-classes with the parameter converted
558 to their type so that we get their copy constructor and not
559 another constructor that takes current_class_type. We must
560 deal with the binfo's directly as a direct base might be
561 inaccessible due to ambiguity. */
9ba5ff0f
NS
562 for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
563 VEC_iterate (tree, vbases, i, binfo); i++)
01f9e964 564 {
c8094d83 565 member_init_list
2282d28d
MM
566 = tree_cons (binfo,
567 build_tree_list (NULL_TREE,
568 build_base_path (PLUS_EXPR, parm,
569 binfo, 1)),
570 member_init_list);
01f9e964
JM
571 }
572
fa743e8c
NS
573 for (binfo = TYPE_BINFO (current_class_type), i = 0;
574 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
f376e137 575 {
fa743e8c 576 if (BINFO_VIRTUAL_P (base_binfo))
c8094d83 577 continue;
f376e137 578
c8094d83 579 member_init_list
fa743e8c 580 = tree_cons (base_binfo,
2282d28d
MM
581 build_tree_list (NULL_TREE,
582 build_base_path (PLUS_EXPR, parm,
fa743e8c 583 base_binfo, 1)),
2282d28d 584 member_init_list);
f376e137 585 }
1b5f5f76 586
f376e137
MS
587 for (; fields; fields = TREE_CHAIN (fields))
588 {
fd749a60 589 tree init = parm;
a5894242 590 tree field = fields;
33dd07ee 591 tree expr_type;
a5894242
MS
592
593 if (TREE_CODE (field) != FIELD_DECL)
f376e137 594 continue;
8dff1027 595
fd749a60 596 expr_type = TREE_TYPE (field);
a5894242 597 if (DECL_NAME (field))
f376e137 598 {
a5894242 599 if (VFIELD_NAME_P (DECL_NAME (field)))
f376e137 600 continue;
f376e137 601 }
fd749a60 602 else if (ANON_AGGR_TYPE_P (expr_type) && TYPE_FIELDS (expr_type))
6bdb8141
JM
603 /* Just use the field; anonymous types can't have
604 nontrivial copy ctors or assignment ops. */;
0171aeab
JM
605 else
606 continue;
f376e137 607
33dd07ee
MM
608 /* Compute the type of "init->field". If the copy-constructor
609 parameter is, for example, "const S&", and the type of
610 the field is "T", then the type will usually be "const
611 T". (There are no cv-qualified variants of reference
612 types.) */
33dd07ee 613 if (TREE_CODE (expr_type) != REFERENCE_TYPE)
fd749a60
NS
614 {
615 int quals = cvquals;
c8094d83 616
fd749a60
NS
617 if (DECL_MUTABLE_P (field))
618 quals &= ~TYPE_QUAL_CONST;
619 expr_type = cp_build_qualified_type (expr_type, quals);
620 }
c8094d83 621
f293ce4b 622 init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
f376e137
MS
623 init = build_tree_list (NULL_TREE, init);
624
fd749a60 625 member_init_list = tree_cons (field, init, member_init_list);
f376e137 626 }
2282d28d 627 finish_mem_initializers (member_init_list);
f376e137 628 }
f376e137
MS
629}
630
824b9a4c 631static void
4977bab6 632do_build_assign_ref (tree fndecl)
f376e137
MS
633{
634 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
f1dedc31 635 tree compound_stmt;
f376e137 636
325c3691 637 compound_stmt = begin_compound_stmt (0);
f376e137
MS
638 parm = convert_from_reference (parm);
639
a59ca936
JM
640 if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
641 && is_empty_class (current_class_type))
642 /* Don't copy the padding byte; it might not have been allocated
643 if *this is a base subobject. */;
644 else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
f376e137 645 {
f293ce4b 646 tree t = build2 (MODIFY_EXPR, void_type_node, current_class_ref, parm);
f1dedc31 647 finish_expr_stmt (t);
f376e137
MS
648 }
649 else
650 {
4ba126e4 651 tree fields;
89d684bb 652 int cvquals = cp_type_quals (TREE_TYPE (parm));
f376e137 653 int i;
fa743e8c 654 tree binfo, base_binfo;
f376e137 655
22ed7e5f 656 /* Assign to each of the direct base classes. */
fa743e8c
NS
657 for (binfo = TYPE_BINFO (current_class_type), i = 0;
658 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
f376e137 659 {
4ba126e4
MM
660 tree converted_parm;
661
4ba126e4
MM
662 /* We must convert PARM directly to the base class
663 explicitly since the base class may be ambiguous. */
fa743e8c 664 converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1);
4ba126e4 665 /* Call the base class assignment operator. */
c8094d83
MS
666 finish_expr_stmt
667 (build_special_member_call (current_class_ref,
4ba126e4 668 ansi_assopname (NOP_EXPR),
c8094d83 669 build_tree_list (NULL_TREE,
4ba126e4 670 converted_parm),
fa743e8c 671 base_binfo,
4ba126e4 672 LOOKUP_NORMAL | LOOKUP_NONVIRTUAL));
f376e137 673 }
4ba126e4
MM
674
675 /* Assign to each of the non-static data members. */
c8094d83
MS
676 for (fields = TYPE_FIELDS (current_class_type);
677 fields;
4ba126e4 678 fields = TREE_CHAIN (fields))
f376e137 679 {
fd749a60
NS
680 tree comp = current_class_ref;
681 tree init = parm;
a5894242 682 tree field = fields;
fd749a60
NS
683 tree expr_type;
684 int quals;
a5894242 685
17bbb839 686 if (TREE_CODE (field) != FIELD_DECL || DECL_ARTIFICIAL (field))
f376e137 687 continue;
e349ee73 688
fd749a60 689 expr_type = TREE_TYPE (field);
c8094d83 690
fd749a60 691 if (CP_TYPE_CONST_P (expr_type))
e349ee73 692 {
0cbd7506
MS
693 error ("non-static const member %q#D, can't use default "
694 "assignment operator", field);
e349ee73
MS
695 continue;
696 }
fd749a60 697 else if (TREE_CODE (expr_type) == REFERENCE_TYPE)
e349ee73 698 {
2a13a625 699 error ("non-static reference member %q#D, can't use "
0cbd7506 700 "default assignment operator", field);
e349ee73
MS
701 continue;
702 }
703
a5894242 704 if (DECL_NAME (field))
f376e137 705 {
a5894242 706 if (VFIELD_NAME_P (DECL_NAME (field)))
f376e137 707 continue;
f376e137 708 }
fd749a60
NS
709 else if (ANON_AGGR_TYPE_P (expr_type)
710 && TYPE_FIELDS (expr_type) != NULL_TREE)
6bdb8141
JM
711 /* Just use the field; anonymous types can't have
712 nontrivial copy ctors or assignment ops. */;
0171aeab
JM
713 else
714 continue;
f376e137 715
fd749a60 716 comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE);
c8094d83 717
fd749a60
NS
718 /* Compute the type of init->field */
719 quals = cvquals;
720 if (DECL_MUTABLE_P (field))
721 quals &= ~TYPE_QUAL_CONST;
722 expr_type = cp_build_qualified_type (expr_type, quals);
c8094d83 723
fd749a60 724 init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
f376e137 725
a1c2b86d 726 if (DECL_NAME (field))
fd749a60 727 init = build_modify_expr (comp, NOP_EXPR, init);
a1c2b86d 728 else
fd749a60
NS
729 init = build2 (MODIFY_EXPR, TREE_TYPE (comp), comp, init);
730 finish_expr_stmt (init);
f376e137
MS
731 }
732 }
62409b39 733 finish_return_stmt (current_class_ref);
7a3397c7 734 finish_compound_stmt (compound_stmt);
f376e137
MS
735}
736
3e3935a9
NS
737/* Synthesize FNDECL, a non-static member function. */
738
f376e137 739void
4977bab6 740synthesize_method (tree fndecl)
f376e137 741{
4977bab6 742 bool nested = (current_function_decl != NULL_TREE);
4f1c5b7d 743 tree context = decl_function_context (fndecl);
4977bab6 744 bool need_body = true;
ade3dc07 745 tree stmt;
39a87435 746 location_t save_input_location = input_location;
3e3935a9
NS
747 int error_count = errorcount;
748 int warning_count = warningcount;
db5ae43f 749
3e3935a9
NS
750 /* Reset the source location, we might have been previously
751 deferred, and thus have saved where we were first needed. */
752 DECL_SOURCE_LOCATION (fndecl)
753 = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl)));
c8094d83 754
db9b2174
MM
755 /* If we've been asked to synthesize a clone, just synthesize the
756 cloned function instead. Doing so will automatically fill in the
757 body for the clone. */
758 if (DECL_CLONED_FUNCTION_P (fndecl))
3e3935a9 759 fndecl = DECL_CLONED_FUNCTION (fndecl);
db9b2174 760
afb19ffb
KL
761 /* We may be in the middle of deferred access check. Disable
762 it now. */
763 push_deferring_access_checks (dk_no_deferred);
764
9a3b49ac
MS
765 if (! context)
766 push_to_top_level ();
767 else if (nested)
99dccabc 768 push_function_context_to (context);
db5ae43f 769
39a87435 770 input_location = DECL_SOURCE_LOCATION (fndecl);
62409b39 771
058b15c1 772 start_preparsed_function (fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
ade3dc07 773 stmt = begin_function_body ();
db5ae43f 774
596ea4e5 775 if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
62409b39
MM
776 {
777 do_build_assign_ref (fndecl);
4977bab6 778 need_body = false;
62409b39 779 }
cdd2559c 780 else if (DECL_CONSTRUCTOR_P (fndecl))
db5ae43f 781 {
e0fff4b3 782 tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
db5ae43f
MS
783 if (arg_chain != void_list_node)
784 do_build_copy_constructor (fndecl);
785 else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
cdd2559c 786 finish_mem_initializers (NULL_TREE);
62409b39 787 }
f18a14bc 788
62409b39
MM
789 /* If we haven't yet generated the body of the function, just
790 generate an empty compound statement. */
791 if (need_body)
792 {
793 tree compound_stmt;
325c3691 794 compound_stmt = begin_compound_stmt (BCS_FN_BODY);
7a3397c7 795 finish_compound_stmt (compound_stmt);
db5ae43f
MS
796 }
797
ade3dc07 798 finish_function_body (stmt);
8cd2462c 799 expand_or_defer_fn (finish_function (0));
28cbf42c 800
39a87435
AO
801 input_location = save_input_location;
802
9a3b49ac
MS
803 if (! context)
804 pop_from_top_level ();
805 else if (nested)
99dccabc 806 pop_function_context_from (context);
afb19ffb
KL
807
808 pop_deferring_access_checks ();
3e3935a9
NS
809
810 if (error_count != errorcount || warning_count != warningcount)
b2a9b208
NS
811 inform ("%Hsynthesized method %qD first required here ",
812 &input_location, fndecl);
f376e137 813}
9eb71d8c 814
03378143
NS
815/* Use EXTRACTOR to locate the relevant function called for each base &
816 class field of TYPE. CLIENT allows additional information to be passed
f62ea157
JM
817 to EXTRACTOR. Generates the union of all exceptions generated by those
818 functions. Note that we haven't updated TYPE_FIELDS and such of any
819 variants yet, so we need to look at the main one. */
03378143
NS
820
821static tree
4977bab6 822synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
0cbd7506 823 void *client)
03378143
NS
824{
825 tree raises = empty_except_spec;
826 tree fields = TYPE_FIELDS (type);
fa743e8c
NS
827 tree binfo, base_binfo;
828 int i;
f62ea157 829
fa743e8c
NS
830 for (binfo = TYPE_BINFO (type), i = 0;
831 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
03378143 832 {
fa743e8c 833 tree fn = (*extractor) (BINFO_TYPE (base_binfo), client);
03378143 834 if (fn)
0cbd7506
MS
835 {
836 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
c8094d83 837
0cbd7506
MS
838 raises = merge_exception_specifiers (raises, fn_raises);
839 }
03378143
NS
840 }
841 for (; fields; fields = TREE_CHAIN (fields))
842 {
843 tree type = TREE_TYPE (fields);
844 tree fn;
c8094d83 845
17bbb839 846 if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
0cbd7506 847 continue;
03378143 848 while (TREE_CODE (type) == ARRAY_TYPE)
0cbd7506 849 type = TREE_TYPE (type);
03378143 850 if (TREE_CODE (type) != RECORD_TYPE)
0cbd7506 851 continue;
c8094d83 852
03378143
NS
853 fn = (*extractor) (type, client);
854 if (fn)
0cbd7506
MS
855 {
856 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
c8094d83 857
0cbd7506
MS
858 raises = merge_exception_specifiers (raises, fn_raises);
859 }
03378143
NS
860 }
861 return raises;
862}
863
864/* Locate the dtor of TYPE. */
865
866static tree
4977bab6 867locate_dtor (tree type, void *client ATTRIBUTE_UNUSED)
03378143 868{
9f4faeae 869 return CLASSTYPE_DESTRUCTORS (type);
03378143
NS
870}
871
872/* Locate the default ctor of TYPE. */
873
874static tree
4977bab6 875locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
03378143
NS
876{
877 tree fns;
c8094d83 878
03378143
NS
879 if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
880 return NULL_TREE;
aaaa46d2 881
508a1c9c
MM
882 /* Call lookup_fnfields_1 to create the constructor declarations, if
883 necessary. */
884 if (CLASSTYPE_LAZY_DEFAULT_CTOR (type))
885 return lazily_declare_fn (sfk_constructor, type);
886
aaaa46d2 887 for (fns = CLASSTYPE_CONSTRUCTORS (type); fns; fns = OVL_NEXT (fns))
03378143
NS
888 {
889 tree fn = OVL_CURRENT (fns);
890 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
c8094d83 891
63752e29
JM
892 parms = skip_artificial_parms_for (fn, parms);
893
894 if (sufficient_parms_p (parms))
0cbd7506 895 return fn;
03378143
NS
896 }
897 return NULL_TREE;
898}
899
900struct copy_data
901{
902 tree name;
903 int quals;
904};
905
906/* Locate the copy ctor or copy assignment of TYPE. CLIENT_
907 points to a COPY_DATA holding the name (NULL for the ctor)
908 and desired qualifiers of the source operand. */
909
910static tree
4977bab6 911locate_copy (tree type, void *client_)
03378143
NS
912{
913 struct copy_data *client = (struct copy_data *)client_;
914 tree fns;
03378143 915 tree best = NULL_TREE;
4977bab6 916 bool excess_p = false;
c8094d83 917
03378143
NS
918 if (client->name)
919 {
508a1c9c
MM
920 int ix;
921 ix = lookup_fnfields_1 (type, client->name);
922 if (ix < 0)
923 return NULL_TREE;
924 fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
03378143
NS
925 }
926 else if (TYPE_HAS_INIT_REF (type))
508a1c9c
MM
927 {
928 /* If construction of the copy constructor was postponed, create
929 it now. */
930 if (CLASSTYPE_LAZY_COPY_CTOR (type))
931 lazily_declare_fn (sfk_copy_constructor, type);
932 fns = CLASSTYPE_CONSTRUCTORS (type);
933 }
934 else
03378143 935 return NULL_TREE;
03378143
NS
936 for (; fns; fns = OVL_NEXT (fns))
937 {
938 tree fn = OVL_CURRENT (fns);
939 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
940 tree src_type;
941 int excess;
942 int quals;
c8094d83 943
03378143
NS
944 parms = TREE_CHAIN (parms);
945 if (!parms)
0cbd7506 946 continue;
ee76b931 947 src_type = non_reference (TREE_VALUE (parms));
03378143 948 if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
0cbd7506 949 continue;
03378143 950 if (!sufficient_parms_p (TREE_CHAIN (parms)))
0cbd7506 951 continue;
89d684bb 952 quals = cp_type_quals (src_type);
03378143 953 if (client->quals & ~quals)
0cbd7506 954 continue;
03378143
NS
955 excess = quals & ~client->quals;
956 if (!best || (excess_p && !excess))
0cbd7506
MS
957 {
958 best = fn;
959 excess_p = excess;
960 }
03378143 961 else
0cbd7506
MS
962 /* Ambiguous */
963 return NULL_TREE;
03378143
NS
964 }
965 return best;
966}
967
9eb71d8c
MM
968/* Implicitly declare the special function indicated by KIND, as a
969 member of TYPE. For copy constructors and assignment operators,
970 CONST_P indicates whether these functions should take a const
27d6592c
MM
971 reference argument or a non-const reference. Returns the
972 FUNCTION_DECL for the implicitly declared function. */
9eb71d8c
MM
973
974tree
4977bab6 975implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
9eb71d8c 976{
058b15c1
MM
977 tree fn;
978 tree parameter_types = void_list_node;
44d10c10 979 tree return_type;
058b15c1 980 tree fn_type;
03378143 981 tree raises = empty_except_spec;
058b15c1
MM
982 tree rhs_parm_type = NULL_TREE;
983 tree name;
64b2bdb3
MM
984 HOST_WIDE_INT saved_processing_template_decl;
985
b2b800a0 986 /* Because we create declarations for implicitly declared functions
64b2bdb3
MM
987 lazily, we may be creating the declaration for a member of TYPE
988 while in some completely different context. However, TYPE will
989 never be a dependent class (because we never want to do lookups
990 for implicitly defined functions in a dependent class).
991 Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
992 because we only create clones for constructors and destructors
993 when not in a template. */
994 gcc_assert (!dependent_type_p (type));
995 saved_processing_template_decl = processing_template_decl;
996 processing_template_decl = 0;
9eb71d8c 997
508a1c9c
MM
998 type = TYPE_MAIN_VARIANT (type);
999
44d10c10
PB
1000 if (targetm.cxx.cdtor_returns_this () && !TYPE_FOR_JAVA (type))
1001 {
1002 if (kind == sfk_destructor)
1003 /* See comment in check_special_function_return_type. */
1004 return_type = build_pointer_type (void_type_node);
1005 else
1006 return_type = build_pointer_type (type);
1007 }
1008 else
1009 return_type = void_type_node;
1010
9eb71d8c
MM
1011 switch (kind)
1012 {
9eb71d8c 1013 case sfk_destructor:
03378143 1014 /* Destructor. */
058b15c1 1015 name = constructor_name (type);
03378143 1016 raises = synthesize_exception_spec (type, &locate_dtor, 0);
9eb71d8c
MM
1017 break;
1018
1019 case sfk_constructor:
1020 /* Default constructor. */
058b15c1 1021 name = constructor_name (type);
03378143 1022 raises = synthesize_exception_spec (type, &locate_ctor, 0);
9eb71d8c
MM
1023 break;
1024
1025 case sfk_copy_constructor:
9eb71d8c 1026 case sfk_assignment_operator:
03378143
NS
1027 {
1028 struct copy_data data;
c8094d83 1029
a2095778
NS
1030 data.name = NULL;
1031 data.quals = 0;
1032 if (kind == sfk_assignment_operator)
0cbd7506 1033 {
058b15c1 1034 return_type = build_reference_type (type);
0cbd7506
MS
1035 name = ansi_assopname (NOP_EXPR);
1036 data.name = name;
1037 }
058b15c1
MM
1038 else
1039 name = constructor_name (type);
1040
9eb71d8c 1041 if (const_p)
0cbd7506
MS
1042 {
1043 data.quals = TYPE_QUAL_CONST;
058b15c1 1044 rhs_parm_type = build_qualified_type (type, TYPE_QUAL_CONST);
0cbd7506 1045 }
058b15c1
MM
1046 else
1047 rhs_parm_type = type;
1048 rhs_parm_type = build_reference_type (rhs_parm_type);
1049 parameter_types = tree_cons (NULL_TREE, rhs_parm_type, parameter_types);
03378143 1050 raises = synthesize_exception_spec (type, &locate_copy, &data);
9eb71d8c 1051 break;
03378143 1052 }
9eb71d8c 1053 default:
8dc2b103 1054 gcc_unreachable ();
9eb71d8c
MM
1055 }
1056
058b15c1
MM
1057 /* Create the function. */
1058 fn_type = build_method_type_directly (type, return_type, parameter_types);
1059 if (raises)
1060 fn_type = build_exception_variant (fn_type, raises);
1061 fn = build_lang_decl (FUNCTION_DECL, name, fn_type);
aaaa46d2 1062 DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (TYPE_NAME (type));
058b15c1
MM
1063 if (kind == sfk_constructor || kind == sfk_copy_constructor)
1064 DECL_CONSTRUCTOR_P (fn) = 1;
1065 else if (kind == sfk_destructor)
1066 DECL_DESTRUCTOR_P (fn) = 1;
1067 else
1068 {
1069 DECL_ASSIGNMENT_OPERATOR_P (fn) = 1;
1070 SET_OVERLOADED_OPERATOR_CODE (fn, NOP_EXPR);
1071 }
1072 /* Create the argument list. The call to "grokclassfn" will add the
1073 "this" parameter and any other implicit parameters. */
1074 if (rhs_parm_type)
1075 {
1076 /* Note that this parameter is *not* marked DECL_ARTIFICIAL; we
1077 want its type to be included in the mangled function
1078 name. */
1079 DECL_ARGUMENTS (fn) = cp_build_parm_decl (NULL_TREE, rhs_parm_type);
1080 TREE_READONLY (DECL_ARGUMENTS (fn)) = 1;
1081 }
9eb71d8c 1082
058b15c1 1083 grokclassfn (type, fn, kind == sfk_destructor ? DTOR_FLAG : NO_SPECIAL,
3c01e5df 1084 TYPE_UNQUALIFIED);
058b15c1 1085 grok_special_member_properties (fn);
4684cd27 1086 set_linkage_according_to_type (type, fn);
0e6df31e 1087 rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
058b15c1 1088 DECL_IN_AGGR_P (fn) = 1;
c727aa5e 1089 DECL_ARTIFICIAL (fn) = 1;
9eb71d8c 1090 DECL_NOT_REALLY_EXTERN (fn) = 1;
79065db2 1091 DECL_DECLARED_INLINE_P (fn) = 1;
9eb71d8c 1092 DECL_INLINE (fn) = 1;
8dc2b103 1093 gcc_assert (!TREE_USED (fn));
9f4faeae 1094
64b2bdb3
MM
1095 /* Restore PROCESSING_TEMPLATE_DECL. */
1096 processing_template_decl = saved_processing_template_decl;
1097
9eb71d8c
MM
1098 return fn;
1099}
e0fff4b3 1100
508a1c9c
MM
1101/* Add an implicit declaration to TYPE for the kind of function
1102 indicated by SFK. Return the FUNCTION_DECL for the new implicit
1103 declaration. */
1104
1105tree
1106lazily_declare_fn (special_function_kind sfk, tree type)
1107{
1108 tree fn;
1109 bool const_p;
1110
1111 /* Figure out whether or not the argument has a const reference
1112 type. */
1113 if (sfk == sfk_copy_constructor)
1114 const_p = TYPE_HAS_CONST_INIT_REF (type);
1115 else if (sfk == sfk_assignment_operator)
1116 const_p = TYPE_HAS_CONST_ASSIGN_REF (type);
1117 else
1118 /* In this case, CONST_P will be ignored. */
1119 const_p = false;
1120 /* Declare the function. */
1121 fn = implicitly_declare_fn (sfk, type, const_p);
9f4faeae
MM
1122 /* A destructor may be virtual. */
1123 if (sfk == sfk_destructor)
1124 check_for_override (fn, type);
508a1c9c 1125 /* Add it to CLASSTYPE_METHOD_VEC. */
b2a9b208 1126 add_method (type, fn, NULL_TREE);
508a1c9c 1127 /* Add it to TYPE_METHODS. */
c8094d83 1128 if (sfk == sfk_destructor
9f4faeae
MM
1129 && DECL_VIRTUAL_P (fn)
1130 && abi_version_at_least (2))
1131 /* The ABI requires that a virtual destructor go at the end of the
1132 vtable. */
1133 TYPE_METHODS (type) = chainon (TYPE_METHODS (type), fn);
1134 else
1135 {
1136 /* G++ 3.2 put the implicit destructor at the *beginning* of the
1137 TYPE_METHODS list, which cause the destructor to be emitted
c8094d83 1138 in an incorrect location in the vtable. */
9f4faeae 1139 if (warn_abi && DECL_VIRTUAL_P (fn))
d4ee4d25 1140 warning (0, "vtable layout for class %qT may not be ABI-compliant"
9f4faeae
MM
1141 "and may change in a future version of GCC due to "
1142 "implicit virtual destructor",
1143 type);
1144 TREE_CHAIN (fn) = TYPE_METHODS (type);
1145 TYPE_METHODS (type) = fn;
1146 }
508a1c9c 1147 maybe_add_class_template_decl_list (type, fn, /*friend_p=*/0);
9f4faeae
MM
1148 if (sfk == sfk_assignment_operator)
1149 CLASSTYPE_LAZY_ASSIGNMENT_OP (type) = 0;
1150 else
508a1c9c
MM
1151 {
1152 /* Remember that the function has been created. */
1153 if (sfk == sfk_constructor)
1154 CLASSTYPE_LAZY_DEFAULT_CTOR (type) = 0;
9f4faeae 1155 else if (sfk == sfk_copy_constructor)
508a1c9c 1156 CLASSTYPE_LAZY_COPY_CTOR (type) = 0;
9f4faeae
MM
1157 else if (sfk == sfk_destructor)
1158 CLASSTYPE_LAZY_DESTRUCTOR (type) = 0;
508a1c9c
MM
1159 /* Create appropriate clones. */
1160 clone_function_decl (fn, /*update_method_vec=*/true);
1161 }
1162
1163 return fn;
1164}
1165
e0fff4b3
JM
1166/* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1167 as there are artificial parms in FN. */
1168
1169tree
4977bab6 1170skip_artificial_parms_for (tree fn, tree list)
e0fff4b3
JM
1171{
1172 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1173 list = TREE_CHAIN (list);
1174 else
1175 return list;
1176
1177 if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1178 list = TREE_CHAIN (list);
1179 if (DECL_HAS_VTT_PARM_P (fn))
1180 list = TREE_CHAIN (list);
1181 return list;
1182}
89ce1c8f
JJ
1183
1184#include "gt-cp-method.h"
This page took 2.030023 seconds and 5 git commands to generate.