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