From 055c51fc448ef2ce14ef9a357af2309826b374cd Mon Sep 17 00:00:00 2001 From: Alexander Karzhenkov Date: Tue, 2 Jul 2019 14:04:59 +0500 Subject: [PATCH 1/5] Test for is_buffer_sequence: false positives --- asio/src/Makefile.mgw | 1 + asio/src/Makefile.msc | 1 + asio/src/tests/Makefile.am | 3 ++ asio/src/tests/unit/is_buffer_sequence.cpp | 52 ++++++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 asio/src/tests/unit/is_buffer_sequence.cpp diff --git a/asio/src/Makefile.mgw b/asio/src/Makefile.mgw index 86b208c7d1..b4ee506759 100644 --- a/asio/src/Makefile.mgw +++ b/asio/src/Makefile.mgw @@ -53,6 +53,7 @@ UNIT_TEST_EXES = \ tests/unit/ip/udp.exe \ tests/unit/ip/unicast.exe \ tests/unit/ip/v6_only.exe \ + tests/unit/is_buffer_sequence.exe \ tests/unit/is_read_buffered.exe \ tests/unit/is_write_buffered.exe \ tests/unit/placeholders.exe \ diff --git a/asio/src/Makefile.msc b/asio/src/Makefile.msc index 8fafd15450..75fae8cf1e 100644 --- a/asio/src/Makefile.msc +++ b/asio/src/Makefile.msc @@ -174,6 +174,7 @@ UNIT_TEST_EXES = \ tests\unit\ip\udp.exe \ tests\unit\ip\unicast.exe \ tests\unit\ip\v6_only.exe \ + tests\unit\is_buffer_sequence.exe \ tests\unit\is_read_buffered.exe \ tests\unit\is_write_buffered.exe \ tests\unit\packaged_task.exe \ diff --git a/asio/src/tests/Makefile.am b/asio/src/tests/Makefile.am index 4c7ffd245b..84ca20b542 100644 --- a/asio/src/tests/Makefile.am +++ b/asio/src/tests/Makefile.am @@ -74,6 +74,7 @@ check_PROGRAMS = \ unit/ip/udp \ unit/ip/unicast \ unit/ip/v6_only \ + unit/is_buffer_sequence \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ @@ -208,6 +209,7 @@ TESTS = \ unit/ip/udp \ unit/ip/unicast \ unit/ip/v6_only \ + unit/is_buffer_sequence \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ @@ -352,6 +354,7 @@ unit_ip_tcp_SOURCES = unit/ip/tcp.cpp unit_ip_udp_SOURCES = unit/ip/udp.cpp unit_ip_unicast_SOURCES = unit/ip/unicast.cpp unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp +unit_is_buffer_sequence_SOURCES = unit/is_buffer_sequence.cpp unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp diff --git a/asio/src/tests/unit/is_buffer_sequence.cpp b/asio/src/tests/unit/is_buffer_sequence.cpp new file mode 100644 index 0000000000..7b9118f82b --- /dev/null +++ b/asio/src/tests/unit/is_buffer_sequence.cpp @@ -0,0 +1,52 @@ +// +// is_buffer_sequence.cpp +// ~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2019 Alexander Karzhenkov +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +//#define ASIO_DISABLE_DECLTYPE + +#include "asio/buffer.hpp" +#include "unit_test.hpp" + +using namespace asio; + +namespace { + +struct A1 +{ + mutable_buffer* begin(); + + // no "value_type" type + // no "const_iterator" type + // no "end" member function +}; + +struct B1 +{ + typedef mutable_buffer value_type; + + // bad "const_iterator" type + typedef void const_iterator; + + // no "begin" member function + // no "end" member function +}; + +void run() +{ + ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK(!is_mutable_buffer_sequence::value); +} + +} // namespace + +ASIO_TEST_SUITE +( + "is_buffer_sequence", + ASIO_TEST_CASE(run) +) From 08c22be4bc0155394ac8b4820f72d9be07e990e2 Mon Sep 17 00:00:00 2001 From: Alexander Karzhenkov Date: Tue, 2 Jul 2019 21:51:42 +0500 Subject: [PATCH 2/5] Test for is_buffer_sequence: add variant with decltype disabled --- asio/src/Makefile.mgw | 1 + asio/src/Makefile.msc | 1 + asio/src/tests/Makefile.am | 3 +++ asio/src/tests/unit/is_buffer_sequence.cpp | 10 ++++++++-- .../tests/unit/is_buffer_sequence_no_decltype.cpp | 12 ++++++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 asio/src/tests/unit/is_buffer_sequence_no_decltype.cpp diff --git a/asio/src/Makefile.mgw b/asio/src/Makefile.mgw index b4ee506759..e05de8755a 100644 --- a/asio/src/Makefile.mgw +++ b/asio/src/Makefile.mgw @@ -54,6 +54,7 @@ UNIT_TEST_EXES = \ tests/unit/ip/unicast.exe \ tests/unit/ip/v6_only.exe \ tests/unit/is_buffer_sequence.exe \ + tests/unit/is_buffer_sequence_no_decltype.exe \ tests/unit/is_read_buffered.exe \ tests/unit/is_write_buffered.exe \ tests/unit/placeholders.exe \ diff --git a/asio/src/Makefile.msc b/asio/src/Makefile.msc index 75fae8cf1e..ed26bf7ea9 100644 --- a/asio/src/Makefile.msc +++ b/asio/src/Makefile.msc @@ -175,6 +175,7 @@ UNIT_TEST_EXES = \ tests\unit\ip\unicast.exe \ tests\unit\ip\v6_only.exe \ tests\unit\is_buffer_sequence.exe \ + tests\unit\is_buffer_sequence_no_decltype.exe \ tests\unit\is_read_buffered.exe \ tests\unit\is_write_buffered.exe \ tests\unit\packaged_task.exe \ diff --git a/asio/src/tests/Makefile.am b/asio/src/tests/Makefile.am index 84ca20b542..4cbedc4484 100644 --- a/asio/src/tests/Makefile.am +++ b/asio/src/tests/Makefile.am @@ -75,6 +75,7 @@ check_PROGRAMS = \ unit/ip/unicast \ unit/ip/v6_only \ unit/is_buffer_sequence \ + unit/is_buffer_sequence_no_decltype \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ @@ -210,6 +211,7 @@ TESTS = \ unit/ip/unicast \ unit/ip/v6_only \ unit/is_buffer_sequence \ + unit/is_buffer_sequence_no_decltype \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ @@ -355,6 +357,7 @@ unit_ip_udp_SOURCES = unit/ip/udp.cpp unit_ip_unicast_SOURCES = unit/ip/unicast.cpp unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp unit_is_buffer_sequence_SOURCES = unit/is_buffer_sequence.cpp +unit_is_buffer_sequence_no_decltype_SOURCES = unit/is_buffer_sequence_no_decltype.cpp unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp diff --git a/asio/src/tests/unit/is_buffer_sequence.cpp b/asio/src/tests/unit/is_buffer_sequence.cpp index 7b9118f82b..8c40117fef 100644 --- a/asio/src/tests/unit/is_buffer_sequence.cpp +++ b/asio/src/tests/unit/is_buffer_sequence.cpp @@ -8,11 +8,15 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // -//#define ASIO_DISABLE_DECLTYPE - #include "asio/buffer.hpp" #include "unit_test.hpp" +#ifdef ASIO_HAS_DECLTYPE +# define ASIO_HAS_DECLTYPE_MSG "ASIO_HAS_DECLTYPE is defined" +#else +# define ASIO_HAS_DECLTYPE_MSG "ASIO_HAS_DECLTYPE is not defined" +#endif + using namespace asio; namespace { @@ -39,6 +43,8 @@ struct B1 void run() { + ASIO_TEST_IOSTREAM << ASIO_HAS_DECLTYPE_MSG << std::endl; + ASIO_CHECK(!is_mutable_buffer_sequence::value); ASIO_CHECK(!is_mutable_buffer_sequence::value); } diff --git a/asio/src/tests/unit/is_buffer_sequence_no_decltype.cpp b/asio/src/tests/unit/is_buffer_sequence_no_decltype.cpp new file mode 100644 index 0000000000..1a1d580130 --- /dev/null +++ b/asio/src/tests/unit/is_buffer_sequence_no_decltype.cpp @@ -0,0 +1,12 @@ +// +// is_buffer_sequence_no_decltype.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2019 Alexander Karzhenkov +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#define ASIO_DISABLE_DECLTYPE +#include "is_buffer_sequence.cpp" From 548f675f0338a61c61061b770164f4b7906ff12f Mon Sep 17 00:00:00 2001 From: Alexander Karzhenkov Date: Tue, 2 Jul 2019 14:52:29 +0500 Subject: [PATCH 3/5] Try to fix is_buffer_sequence --- asio/include/asio/detail/is_buffer_sequence.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asio/include/asio/detail/is_buffer_sequence.hpp b/asio/include/asio/detail/is_buffer_sequence.hpp index 937d22215d..41ca2308ff 100644 --- a/asio/include/asio/detail/is_buffer_sequence.hpp +++ b/asio/include/asio/detail/is_buffer_sequence.hpp @@ -214,8 +214,8 @@ char mutable_buffers_type_typedef_helper( template struct is_buffer_sequence_class : integral_constant(0)) != 1 && - sizeof(buffer_sequence_end_helper(0)) != 1 && + sizeof(buffer_sequence_begin_helper(0, 0)) != 1 && + sizeof(buffer_sequence_end_helper(0, 0)) != 1 && sizeof(buffer_sequence_element_type_helper(0, 0)) == 1> { }; From 74b99cb0f38b6a77d4f757bf33a588fc64427793 Mon Sep 17 00:00:00 2001 From: Alexander Karzhenkov Date: Tue, 2 Jul 2019 15:31:50 +0500 Subject: [PATCH 4/5] Try to fix is_buffer_sequence (solution from boostorg/asio PR #218) --- .../asio/detail/is_buffer_sequence.hpp | 26 ++++++++++++------- asio/src/tests/unit/is_buffer_sequence.cpp | 10 +++++++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/asio/include/asio/detail/is_buffer_sequence.hpp b/asio/include/asio/detail/is_buffer_sequence.hpp index 41ca2308ff..330137676b 100644 --- a/asio/include/asio/detail/is_buffer_sequence.hpp +++ b/asio/include/asio/detail/is_buffer_sequence.hpp @@ -53,19 +53,22 @@ struct buffer_sequence_memfns_check { }; -template -char (&buffer_sequence_begin_helper(...))[2]; - #if defined(ASIO_HAS_DECLTYPE) +template +char buffer_sequence_begin_helper(...); + template -char buffer_sequence_begin_helper(T* t, +char (&buffer_sequence_begin_helper(T* t, typename enable_if::value>::type*); + void>::value>::type*))[2]; #else // defined(ASIO_HAS_DECLTYPE) +template +char (&buffer_sequence_begin_helper(...))[2]; + template char buffer_sequence_begin_helper(T* t, buffer_sequence_memfns_check< @@ -74,19 +77,22 @@ char buffer_sequence_begin_helper(T* t, #endif // defined(ASIO_HAS_DECLTYPE) -template -char (&buffer_sequence_end_helper(...))[2]; - #if defined(ASIO_HAS_DECLTYPE) +template +char buffer_sequence_end_helper(...); + template -char buffer_sequence_end_helper(T* t, +char (&buffer_sequence_end_helper(T* t, typename enable_if::value>::type*); + void>::value>::type*))[2]; #else // defined(ASIO_HAS_DECLTYPE) +template +char (&buffer_sequence_end_helper(...))[2]; + template char buffer_sequence_end_helper(T* t, buffer_sequence_memfns_check< diff --git a/asio/src/tests/unit/is_buffer_sequence.cpp b/asio/src/tests/unit/is_buffer_sequence.cpp index 8c40117fef..9a772b787d 100644 --- a/asio/src/tests/unit/is_buffer_sequence.cpp +++ b/asio/src/tests/unit/is_buffer_sequence.cpp @@ -41,12 +41,22 @@ struct B1 // no "end" member function }; +struct X1 +{ + typedef mutable_buffer value_type; + typedef const mutable_buffer* const_iterator; + + const mutable_buffer* begin() const; + const mutable_buffer* end() const; +}; + void run() { ASIO_TEST_IOSTREAM << ASIO_HAS_DECLTYPE_MSG << std::endl; ASIO_CHECK(!is_mutable_buffer_sequence::value); ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK( is_mutable_buffer_sequence::value); } } // namespace From efb11146d69ae6d815cd7d2b21f17ee830f2bdf5 Mon Sep 17 00:00:00 2001 From: Alexander Karzhenkov Date: Tue, 2 Jul 2019 16:24:31 +0500 Subject: [PATCH 5/5] More checks for is_buffer_sequence: there is still a problem --- asio/src/tests/unit/is_buffer_sequence.cpp | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/asio/src/tests/unit/is_buffer_sequence.cpp b/asio/src/tests/unit/is_buffer_sequence.cpp index 9a772b787d..f58882a461 100644 --- a/asio/src/tests/unit/is_buffer_sequence.cpp +++ b/asio/src/tests/unit/is_buffer_sequence.cpp @@ -8,13 +8,16 @@ // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // +#include #include "asio/buffer.hpp" #include "unit_test.hpp" #ifdef ASIO_HAS_DECLTYPE # define ASIO_HAS_DECLTYPE_MSG "ASIO_HAS_DECLTYPE is defined" +# define ASIO_HAS_DECLTYPE_FLAG true #else # define ASIO_HAS_DECLTYPE_MSG "ASIO_HAS_DECLTYPE is not defined" +# define ASIO_HAS_DECLTYPE_FLAG false #endif using namespace asio; @@ -50,6 +53,33 @@ struct X1 const mutable_buffer* end() const; }; +struct B2 +{ + typedef mutable_buffer value_type; + typedef void const_iterator; // (!) + + const mutable_buffer* begin() const; + const mutable_buffer* end() const; +}; + +struct B3 +{ + typedef mutable_buffer value_type; + typedef const mutable_buffer* const_iterator; + + int begin; // (!) + const mutable_buffer* end() const; +}; + +struct C1 +{ + typedef mutable_buffer value_type; + typedef const mutable_buffer* const_iterator; + + const mutable_buffer* begin() const; + int end() const; // (!) +}; + void run() { ASIO_TEST_IOSTREAM << ASIO_HAS_DECLTYPE_MSG << std::endl; @@ -57,6 +87,27 @@ void run() ASIO_CHECK(!is_mutable_buffer_sequence::value); ASIO_CHECK(!is_mutable_buffer_sequence::value); ASIO_CHECK( is_mutable_buffer_sequence::value); + ASIO_CHECK( is_mutable_buffer_sequence::value == ASIO_HAS_DECLTYPE_FLAG); + ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK(!is_mutable_buffer_sequence::value); + + ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK(!is_const_buffer_sequence::value); + + ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK(!is_const_buffer_sequence::value); + + ASIO_CHECK( is_mutable_buffer_sequence::value); + ASIO_CHECK( is_const_buffer_sequence::value); + + ASIO_CHECK(!is_mutable_buffer_sequence::value); + ASIO_CHECK( is_const_buffer_sequence::value); + + ASIO_CHECK( is_mutable_buffer_sequence >::value); + ASIO_CHECK( is_const_buffer_sequence >::value); + + ASIO_CHECK(!is_mutable_buffer_sequence >::value); + ASIO_CHECK( is_const_buffer_sequence >::value); } } // namespace