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
This commit is contained in:
parent
f28c46cdb8
commit
6edee4b3d3
6 changed files with 57 additions and 3 deletions
|
@ -1,3 +1,10 @@
|
|||
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>
|
||||
|
||||
PR c++/89001 - mangling of reference temporaries
|
||||
|
|
|
@ -6461,6 +6461,19 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
|
|||
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
|
||||
parameter of type std::align_val_t is preferred; otherwise a
|
||||
function without such a parameter is preferred. If exactly one
|
||||
|
|
|
@ -1757,9 +1757,9 @@ coerce_delete_type (tree decl, location_t loc)
|
|||
if (destroying_delete_p (decl))
|
||||
{
|
||||
if (DECL_CLASS_SCOPE_P (decl))
|
||||
/* If the function is a destroying operator delete declared in class type
|
||||
C, the type of its first parameter shall be C*. */
|
||||
ptrtype = TYPE_POINTER_TO (DECL_CONTEXT (decl));
|
||||
/* If the function is a destroying operator delete declared in class
|
||||
type C, the type of its first parameter shall be C*. */
|
||||
ptrtype = build_pointer_type (DECL_CONTEXT (decl));
|
||||
else
|
||||
/* A destroying operator delete shall be a class member function named
|
||||
operator delete. */
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
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>
|
||||
|
||||
PR fortran/85780
|
||||
|
|
20
gcc/testsuite/g++.dg/cpp2a/destroying-delete2.C
Normal file
20
gcc/testsuite/g++.dg/cpp2a/destroying-delete2.C
Normal file
|
@ -0,0 +1,20 @@
|
|||
// 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" }
|
||||
}
|
8
gcc/testsuite/g++.dg/cpp2a/destroying-delete3.C
Normal file
8
gcc/testsuite/g++.dg/cpp2a/destroying-delete3.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// 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*." }
|
||||
};
|
Loading…
Add table
Reference in a new issue