aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/call.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-08-26 11:10:57 -0400
committerJason Merrill <jason@gcc.gnu.org>2016-08-26 11:10:57 -0400
commitd0b0fbd9fce2f30a82558bf2308b3a7b56c2f364 (patch)
tree8b759d9ca7a0bbc18fbf82d0501f69c847a84582 /gcc/cp/call.c
parent9729a5d5241257d07aa2a9c2fa6c3abbd73e25e5 (diff)
downloadgcc-d0b0fbd9fce2f30a82558bf2308b3a7b56c2f364.zip
gcc-d0b0fbd9fce2f30a82558bf2308b3a7b56c2f364.tar.gz
gcc-d0b0fbd9fce2f30a82558bf2308b3a7b56c2f364.tar.bz2
Avoid calling a trivial default constructor.
* class.c (default_ctor_p): New. (in_class_defaulted_default_constructor): Use it. (type_has_non_user_provided_default_constructor): Use it. * call.c (build_over_call): Handle trivial default constructor. * cp-tree.h: Declare default_ctor_p. From-SVN: r239783
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r--gcc/cp/call.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 05f0431..024519d 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -7798,11 +7798,19 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
return val;
}
- else if (DECL_DESTRUCTOR_P (fn)
- && trivial_fn_p (fn)
- && !DECL_DELETED_FN (fn))
- return fold_convert (void_type_node, argarray[0]);
- /* FIXME handle trivial default constructor, too. */
+ else if (!DECL_DELETED_FN (fn)
+ && trivial_fn_p (fn))
+ {
+ if (DECL_DESTRUCTOR_P (fn))
+ return fold_convert (void_type_node, argarray[0]);
+ else if (default_ctor_p (fn))
+ {
+ if (is_dummy_object (argarray[0]))
+ return force_target_expr (DECL_CONTEXT (fn), void_node, complain);
+ else
+ return cp_build_indirect_ref (argarray[0], RO_NULL, complain);
+ }
+ }
/* For calls to a multi-versioned function, overload resolution
returns the function with the highest target priority, that is,