diff options
author | Jason Merrill <jason@redhat.com> | 2017-08-10 15:55:48 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2017-08-10 15:55:48 -0400 |
commit | 339922f4e10dde8a09dadcb8af2099f8ee7d30d8 (patch) | |
tree | 768fd25589fde93753563e2bdc45c4b7cde3c543 /gcc | |
parent | 4ce8c5dea53d80736b9c0ba6faa7430ed65ed365 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/method.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/vdtor1.C | 7 |
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 {}; |