aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2018-02-26 12:06:07 -0500
committerJason Merrill <jason@gcc.gnu.org>2018-02-26 12:06:07 -0500
commit18101e7383f79184d9e0e1a6593141770eeb0414 (patch)
treee39976d23aa4a34112c40df1327e326eabf482d3
parentf18f8ade38e5a71e7bdafa46f0972b45e835ea9e (diff)
downloadgcc-18101e7383f79184d9e0e1a6593141770eeb0414.zip
gcc-18101e7383f79184d9e0e1a6593141770eeb0414.tar.gz
gcc-18101e7383f79184d9e0e1a6593141770eeb0414.tar.bz2
PR c++/84447 - ICE with deleted inherited ctor with default arg.
* call.c (build_over_call): Handle deleted functions in one place. From-SVN: r258003
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c22
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor31.C14
3 files changed, 28 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 97559ed..59d4cee 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-26 Jason Merrill <jason@redhat.com>
+
+ PR c++/84447 - ICE with deleted inherited ctor with default arg.
+ * call.c (build_over_call): Handle deleted functions in one place.
+
2018-02-26 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84533
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 7c93c6d..c47befd 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -7665,8 +7665,12 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
deduce_inheriting_ctor (fn);
/* Make =delete work with SFINAE. */
- if (DECL_DELETED_FN (fn) && !(complain & tf_error))
- return error_mark_node;
+ if (DECL_DELETED_FN (fn))
+ {
+ if (complain & tf_error)
+ mark_used (fn);
+ return error_mark_node;
+ }
if (DECL_FUNCTION_MEMBER_P (fn))
{
@@ -7710,12 +7714,6 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
conversions. */
if (flags & LOOKUP_SPECULATIVE)
{
- if (DECL_DELETED_FN (fn))
- {
- if (complain & tf_error)
- mark_used (fn);
- return error_mark_node;
- }
if (cand->viable == 1)
return fn;
else if (!(complain & tf_error))
@@ -8090,7 +8088,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
/* [class.copy]: the copy constructor is implicitly defined even if
the implementation elided its use. */
- if (!trivial || DECL_DELETED_FN (fn))
+ if (!trivial)
{
if (!mark_used (fn, complain) && !(complain & tf_error))
return error_mark_node;
@@ -8121,8 +8119,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
}
else if (DECL_ASSIGNMENT_OPERATOR_P (fn)
&& DECL_OVERLOADED_OPERATOR_IS (fn, NOP_EXPR)
- && trivial_fn_p (fn)
- && !DECL_DELETED_FN (fn))
+ && trivial_fn_p (fn))
{
tree to = cp_stabilize_reference
(cp_build_fold_indirect_ref (argarray[0]));
@@ -8166,8 +8163,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
return val;
}
- else if (!DECL_DELETED_FN (fn)
- && trivial_fn_p (fn))
+ else if (trivial_fn_p (fn))
{
if (DECL_DESTRUCTOR_P (fn))
return fold_convert (void_type_node, argarray[0]);
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor31.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor31.C
new file mode 100644
index 0000000..071f178
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor31.C
@@ -0,0 +1,14 @@
+// PR c++/84447
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ template<typename T> A(T, T = 0) = delete;
+};
+
+struct B : A
+{
+ using A::A; // { dg-error "deleted" }
+};
+
+B b(0); // { dg-error "deleted" }