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