aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2017-08-10 15:55:48 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-08-10 15:55:48 -0400
commit339922f4e10dde8a09dadcb8af2099f8ee7d30d8 (patch)
tree768fd25589fde93753563e2bdc45c4b7cde3c543 /gcc
parent4ce8c5dea53d80736b9c0ba6faa7430ed65ed365 (diff)
downloadgcc-339922f4e10dde8a09dadcb8af2099f8ee7d30d8.zip
gcc-339922f4e10dde8a09dadcb8af2099f8ee7d30d8.tar.gz
gcc-339922f4e10dde8a09dadcb8af2099f8ee7d30d8.tar.bz2
PR c++/81359 - Unparsed NSDMI error from SFINAE context.
* method.c (synthesized_method_walk): Don't diagnose lack of operator delete. From-SVN: r251036
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/method.c14
-rw-r--r--gcc/testsuite/g++.dg/inherit/vdtor1.C7
3 files changed, 21 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bc4eaa2..792a42a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2017-08-10 Jason Merrill <jason@redhat.com>
+ 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 bff9605..809ebc8 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 0000000..caba17f
--- /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 {};