Commit 6edee4b3 by Paolo Carlini Committed by Paolo Carlini

re PR c++/88969 (ICE in build_op_delete_call, at cp/call.c:6509)

/cp
2019-01-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/88969
	* call.c (build_op_delete_call): Implement 7.6.2.5/(10.1).
	* decl2.c (coerce_delete_type): Use build_pointer_type instead
	of TYPE_POINTER_TO.

/testsuite
2019-01-25  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/88969
	* g++.dg/cpp2a/destroying-delete2.C: New.
	* g++.dg/cpp2a/destroying-delete3.C: Likewise.

From-SVN: r268278
parent f28c46cd
2019-01-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/88969
* call.c (build_op_delete_call): Implement 7.6.2.5/(10.1).
* decl2.c (coerce_delete_type): Use build_pointer_type instead
of TYPE_POINTER_TO.
2019-01-24 Jason Merrill <jason@redhat.com> 2019-01-24 Jason Merrill <jason@redhat.com>
PR c++/89001 - mangling of reference temporaries PR c++/89001 - mangling of reference temporaries
......
...@@ -6461,6 +6461,19 @@ build_op_delete_call (enum tree_code code, tree addr, tree size, ...@@ -6461,6 +6461,19 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
continue; continue;
} }
/* -- If any of the deallocation functions is a destroying
operator delete, all deallocation functions that are not
destroying operator deletes are eliminated from further
consideration. */
bool fn_destroying = destroying_delete_p (fn);
bool elt_destroying = destroying_delete_p (elt);
if (elt_destroying != fn_destroying)
{
if (elt_destroying)
fn = elt;
continue;
}
/* -- If the type has new-extended alignment, a function with a /* -- If the type has new-extended alignment, a function with a
parameter of type std::align_val_t is preferred; otherwise a parameter of type std::align_val_t is preferred; otherwise a
function without such a parameter is preferred. If exactly one function without such a parameter is preferred. If exactly one
......
...@@ -1757,9 +1757,9 @@ coerce_delete_type (tree decl, location_t loc) ...@@ -1757,9 +1757,9 @@ coerce_delete_type (tree decl, location_t loc)
if (destroying_delete_p (decl)) if (destroying_delete_p (decl))
{ {
if (DECL_CLASS_SCOPE_P (decl)) if (DECL_CLASS_SCOPE_P (decl))
/* If the function is a destroying operator delete declared in class type /* If the function is a destroying operator delete declared in class
C, the type of its first parameter shall be C*. */ type C, the type of its first parameter shall be C*. */
ptrtype = TYPE_POINTER_TO (DECL_CONTEXT (decl)); ptrtype = build_pointer_type (DECL_CONTEXT (decl));
else else
/* A destroying operator delete shall be a class member function named /* A destroying operator delete shall be a class member function named
operator delete. */ operator delete. */
......
2019-01-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/88969
* g++.dg/cpp2a/destroying-delete2.C: New.
* g++.dg/cpp2a/destroying-delete3.C: Likewise.
2019-01-25 Steven G. Kargl <kargl@gcc.gnu.org> 2019-01-25 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/85780 PR fortran/85780
......
// PR c++/88969
// { dg-do compile { target c++2a } }
#include <new>
namespace delete_selection_d {
struct B {
void operator delete(void*) = delete;
void operator delete(B *, std::destroying_delete_t) = delete; // { dg-message "declared here" }
};
void delete_B(B *b) { delete b; } // { dg-error "use of deleted function" }
}
namespace delete_selection_r {
struct B {
void operator delete(B *, std::destroying_delete_t) = delete; // { dg-message "declared here" }
void operator delete(void*) = delete;
};
void delete_B(B *b) { delete b; } // { dg-error "use of deleted function" }
}
// PR c++/88969
// { dg-do compile { target c++2a } }
#include <new>
struct B {
void operator delete(void*, std::destroying_delete_t); // { dg-error ".operator delete. takes type .B*." }
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment