diff options
author | Jason Merrill <jason@redhat.com> | 2018-02-26 12:06:07 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-02-26 12:06:07 -0500 |
commit | 18101e7383f79184d9e0e1a6593141770eeb0414 (patch) | |
tree | e39976d23aa4a34112c40df1327e326eabf482d3 /gcc | |
parent | f18f8ade38e5a71e7bdafa46f0972b45e835ea9e (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/inh-ctor31.C | 14 |
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" } |