From 339922f4e10dde8a09dadcb8af2099f8ee7d30d8 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 10 Aug 2017 15:55:48 -0400 Subject: [PATCH] PR c++/81359 - Unparsed NSDMI error from SFINAE context. * method.c (synthesized_method_walk): Don't diagnose lack of operator delete. From-SVN: r251036 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/method.c | 14 ++++++++++---- gcc/testsuite/g++.dg/inherit/vdtor1.C | 7 +++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/inherit/vdtor1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bc4eaa20b46..792a42ad14a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-08-10 Jason Merrill + PR c++/81359 - Unparsed NSDMI error from SFINAE context. + * method.c (synthesized_method_walk): Don't diagnose lack of + operator delete. + PR c++/80452 - Core 1579, implicit move semantics on return/throw * cp-tree.h (LOOKUP_PREFER_RVALUE): Now means that we've already tentatively changed the lvalue to an rvalue. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index bff960513c0..809ebc8311c 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1693,12 +1693,18 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p, if (check_vdtor && type_has_virtual_destructor (BINFO_TYPE (base_binfo))) { - fn = locate_fn_flags (ctype, cp_operator_id (DELETE_EXPR), - ptr_type_node, flags, complain); /* Unlike for base ctor/op=/dtor, for operator delete it's fine to have a null fn (no class-specific op delete). */ - if (fn && fn == error_mark_node && deleted_p) - *deleted_p = true; + fn = locate_fn_flags (ctype, cp_operator_id (DELETE_EXPR), + ptr_type_node, flags, tf_none); + if (fn && fn == error_mark_node) + { + if (complain & tf_error) + locate_fn_flags (ctype, cp_operator_id (DELETE_EXPR), + ptr_type_node, flags, complain); + if (deleted_p) + *deleted_p = true; + } check_vdtor = false; } } diff --git a/gcc/testsuite/g++.dg/inherit/vdtor1.C b/gcc/testsuite/g++.dg/inherit/vdtor1.C new file mode 100644 index 00000000000..caba17fde6a --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/vdtor1.C @@ -0,0 +1,7 @@ +struct A { + void operator delete(void *, unsigned long); +}; +struct B : A { + virtual ~B(); +}; +struct C : B {}; -- 2.30.2