Compare commits

..

26 Commits

Author SHA1 Message Date
Peter Dimov e367d65b6e Fix use of _alloca under g++/clang (mingw/cygwin) 2017-11-01 20:59:34 +02:00
Peter Dimov 5e5cd0fda5 Merge branch 'bugfix' of https://github.com/kghost/boost-system into develop 2017-11-01 20:41:01 +02:00
Peter Dimov a4955ec9c1 Test header-only w/ BOOST_NO_ANSI_APIS 2017-11-01 20:34:53 +02:00
Zang MingJie 0daba59730 Fix MSVC compile error 2017-11-02 01:32:18 +08:00
Peter Dimov 9cc189382d Fix .travis.yml to support branches 2017-10-27 15:33:49 +03:00
Peter Dimov 41c43b6129 Use <cxxstd> in .travis.yml 2017-10-25 17:20:32 +03:00
Peter Dimov 16fc70c76f Merge branch 'update_winapi' of https://github.com/Lastique/system into develop 2017-10-25 00:54:02 +03:00
Andrey Semashev a4b67129ff Updated Boost.WinAPI usage to the new location and namespace. 2017-10-25 00:44:18 +03:00
Peter Dimov 81619e13c3 Merge branch 'master' into develop 2017-10-24 23:39:47 +03:00
Peter Dimov 41e0404847 Merge pull request #18 from boostorg/pr/remove-no-deprecated
Replace BOOST_SYSTEM_NO_DEPRECATED with BOOST_SYSTEM_ENABLE_DEPRECATED
2017-10-23 00:12:19 +03:00
Peter Dimov 829a1320a7 Replace BOOST_SYSTEM_NO_DEPRECATED with BOOST_SYSTEM_ENABLE_DEPRECATED 2017-10-21 19:19:57 +03:00
Beman 1fab2e71cc Merge branch 'develop' 2017-09-14 08:06:21 -04:00
Peter Dimov 54de17d886 Merge commit 'c493242855219beb6476f3bb70e6b2df670852e7' 2017-09-13 15:27:26 +03:00
Peter Dimov 855fc96010 Merge branch 'master' into develop 2017-09-13 15:25:52 +03:00
Peter Dimov fe1991c624 travis: install libstdc++ 4.9 for clang 14/1z 2017-09-11 01:31:51 +03:00
Beman cd38d2f778 Remove unused assignment. This was pull request 15, which was made against master instead of develop. 2017-09-08 15:44:52 -04:00
Beman Dawes 49e2267c3e Merge pull request #15 from 8W9aG/fix-unread-assignment
Remove unread assignment
2017-09-08 15:36:56 -04:00
Beman e039a454cf Hand add the fix from github.com/boostorg/system/pull/12. Note: This fix was verified by testing in release mode with clang 4.0 on Linux. It crashed before applying the P/R and passed afterwards. The pull request was applied by hand to add some new comments and do some other minor code rearrangements. Thanks to Visigoth for the P/R. 2017-09-07 16:36:48 -04:00
Beman 1bb5b95ebd Rewrite the boost::throws() reference documentation. Add tests of boost::throws() using the divide() function from the reference documentation. Having tests will allow us to change the implementation of throws() without fear of silently breaking it. 2017-09-07 15:00:26 -04:00
Peter Dimov c493242855 Merge pull request #17 from Lastique/silence_msvc_warnings
Silence MSVC warnings about 'this' in base class initializer list.
2017-09-06 15:55:23 +03:00
Andrey Semashev b6ef4ad220 Silence MSVC warnings about 'this' in base class initializer list. 2017-09-05 21:32:25 +03:00
Peter Dimov efe849862f travis: install libstdc++ 4.9 for clang 14/1z 2017-09-05 05:26:24 +03:00
Peter Dimov d0fe891bb3 Add 'quick' test target 2017-09-05 04:52:08 +03:00
Peter Dimov 6087f1c529 Merge pull request #14 from DanielaE/feature/qoi-warning
fix narrowing conversion
2017-08-27 20:10:51 +03:00
Daniela Engert d8d71216e9 fix narrowing conversion
Signed-off-by: Daniela Engert <dani@ngrt.de>
2017-08-27 07:11:04 +02:00
Will Sackfield c62bbe9205 Remove unread assignment 2017-05-09 14:37:45 +02:00
13 changed files with 295 additions and 389 deletions
+45 -250
View File
@@ -1,4 +1,4 @@
# Copyright 2016 Peter Dimov
# Copyright 2016, 2017 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
@@ -8,14 +8,11 @@ sudo: false
python: "2.7"
os:
- linux
- osx
branches:
only:
- master
- develop
- /feature\/.*/
env:
matrix:
@@ -28,10 +25,12 @@ matrix:
include:
- os: linux
env: TOOLSET=gcc COMPILER=g++ CXXSTD=c++03
compiler: g++
env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++03
compiler: g++-4.7
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
addons:
apt:
packages:
@@ -40,34 +39,17 @@ matrix:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.7
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++03
compiler: g++-4.8
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++03
compiler: g++-4.9
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
addons:
apt:
packages:
@@ -76,16 +58,8 @@ matrix:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=c++11
addons:
apt:
packages:
- g++-4.9
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++03
compiler: g++-5
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
addons:
apt:
packages:
@@ -94,61 +68,8 @@ matrix:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++11
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++14
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=c++1z
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++03
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++11
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++14
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=c++1z
compiler: g++-6
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
addons:
apt:
packages:
@@ -159,7 +80,7 @@ matrix:
- os: linux
dist: trusty
compiler: g++-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++03
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
addons:
apt:
packages:
@@ -168,46 +89,24 @@ matrix:
- ubuntu-toolchain-r-test
- os: linux
dist: trusty
compiler: g++-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++11
compiler: clang++
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11
- os: linux
compiler: clang++-3.5
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-7
- clang-3.5
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.5
- os: linux
dist: trusty
compiler: g++-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++14
addons:
apt:
packages:
- g++-7
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: trusty
compiler: g++-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=c++17
addons:
apt:
packages:
- g++-7
sources:
- ubuntu-toolchain-r-test
- os: linux
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
- os: linux
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++03
compiler: clang++-3.6
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z
addons:
apt:
packages:
@@ -217,17 +116,8 @@ matrix:
- llvm-toolchain-precise-3.6
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.6
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.6
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++03
compiler: clang++-3.7
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11,14,1z
addons:
apt:
packages:
@@ -237,98 +127,32 @@ matrix:
- llvm-toolchain-precise-3.7
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.7
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++03
compiler: clang++-3.8
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.8
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++14
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=c++1z
addons:
apt:
packages:
- clang-3.8
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++03
addons:
apt:
packages:
- clang-3.9
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.9
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++11
addons:
apt:
packages:
- clang-3.9
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.9
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++14
addons:
apt:
packages:
- clang-3.9
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.9
- os: linux
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=c++1z
compiler: clang++-3.9
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.9
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.9
- os: linux
compiler: clang++-4.0
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++03
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
addons:
apt:
packages:
@@ -338,53 +162,24 @@ matrix:
- llvm-toolchain-trusty-4.0
- os: linux
compiler: clang++-4.0
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++11
compiler: clang++-5.0
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-4.0
- clang-5.0
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-4.0
- os: linux
compiler: clang++-4.0
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++14
addons:
apt:
packages:
- clang-4.0
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-4.0
- os: linux
compiler: clang++-4.0
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=c++1z
addons:
apt:
packages:
- clang-4.0
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-trusty-4.0
- llvm-toolchain-trusty-5.0
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++03
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++11
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++14
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=c++1z
compiler: clang++
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
install:
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
- cd ..
- git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
- git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule update --init tools/build
- git submodule update --init libs/config
@@ -396,8 +191,8 @@ install:
script:
- |-
echo "using $TOOLSET : : $COMPILER : <cxxflags>-std=$CXXSTD ;" > ~/user-config.jam
- ./b2 libs/system/test toolset=$TOOLSET
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
- ./b2 libs/system/test toolset=$TOOLSET cxxstd=$CXXSTD
notifications:
email:
+46 -43
View File
@@ -60,8 +60,7 @@
&nbsp;&nbsp;&nbsp;<a href="#Class-error_condition-constructors">Class <code>error_condition</code> constructors</a><br>
&nbsp;&nbsp;&nbsp;<a href="#Class-error_condition-modifiers">Class <code>error_condition</code> modifiers</a><br>
&nbsp;&nbsp;&nbsp;<a href="#Class-error_condition-observers">Class <code>error_condition</code> observers</a><br>
<a href="#throws-object"><code>throws</code> object</a><br>
<a href="#Semantics-of-throws">Semantics of <code>throws</code> object</a><br>
<a href="#Function-boost-throws">Function <code>boost::throws()</code></a><br>
<a href="#Non-member-functions">Non-member functions</a><br>
<a href="#Header-system_error">Header &lt;boost/system/system_error.hpp&gt;</a><br>
&nbsp;&nbsp;&nbsp;<a href="#Class-system_error">Class <code>system_error</code></a><br>
@@ -81,7 +80,7 @@ noexcept</code> and explicit conversion operators. The actual implementation
uses C++11 features only when they are available, and otherwise falls back on
C++03 features.</p>
<h2><a name="Macros">Macros</a></h2>
<p>Users may defined the following macros if desired. Sensible defaults are
<p>Users may define the following macros if desired. Sensible defaults are
provided, so users may ignore these macros if they prefer.</p>
<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" height="368">
<tr>
@@ -110,17 +109,16 @@ provided, so users may ignore these macros if they prefer.</p>
facility.</td>
</tr>
<tr>
<td valign="top" height="32"><code>BOOST_SYSTEM_NO_DEPRECATED</code></td>
<td valign="top" height="32"><code>BOOST_SYSTEM_ENABLE_DEPRECATED</code></td>
<td valign="top" height="32">Not defined.</td>
<td valign="top" height="32">Deprecated features are excluded.</td>
<td valign="top" height="32">Deprecated features are provided for compatibility.</td>
</tr>
</table>
<h2><a name="Deprecated-names">Deprecated names</a></h2>
<p>In the process of adding Boost.System to C++0x standard library, the C++
committee changed some
names. To ease transition, Boost.System deprecates the old
names, but continues to provide them unless macro <code>BOOST_SYSTEM_NO_DEPRECATED</code>
is defined.</p>
<p>In the process of adding Boost.System to the C++11 standard library, the
C++ committee changed some names. To ease transition, Boost.System deprecates
the old names, but will provide them when the macro
<code>BOOST_SYSTEM_ENABLE_DEPRECATED</code> is defined.</p>
<table border="1" cellpadding="5" cellspacing="1" style="border-collapse: collapse" bordercolor="#111111">
<tr>
<td><b><i>Old usage, now deprecated</i></b></td>
@@ -316,8 +314,12 @@ fixed by globally adding () to these names to turn them into function calls.</p>
operator&lt;&lt;( basic_ostream&lt;charT,traits&gt;&amp; os, const error_code &amp; ec );
size_t hash_value( const error_code &amp; ec );
}
}</pre>
} // namespace system
system::error_code &amp; throws();
} // namespace boost</pre>
</blockquote>
<p>The value of each<code> errc_t</code> constant shall be the same as the
value of the <code>&lt;cerrno&gt;</code> macro shown in the above synopsis.</p>
@@ -644,36 +646,6 @@ observers</a></h3>
<code>int</code>) that can occur with <code>bool</code> are not allowed,
eliminating some sources of user error. One possible implementation choice for
this type is pointer to member. <i>--end note</i> <i>]</i></p>
</blockquote>
<h2><a name="throws-object"><code>throws</code> object</a></h2>
<pre>extern error_code throws;</pre>
<p>The predefined <code>error_code</code> object <code>throws</code> is supplied
for use as a &quot;throw on error&quot; tag.</p>
<h2><a name="Semantics-of-throws">Semantics of <code>throws</code></a> object</h2>
<p>Functions that specify an argument in the form <code>error_code&amp; ec=throws</code>,
with appropriate namespace qualifiers, have the following error handling
semantics:</p>
<blockquote>
<p><i>Postconditions:</i></p>
<blockquote>
<p>If <code>&amp;ec != &amp;throws</code> and an error occurred:</p>
<ul>
<li> <code>ec.value()</code> returns the implementation specific error
number for the particular error that occurred.</li>
<li><code>ec.category()</code> returns the <code>
<a href="#Class-error_category">error_category</a></code> for <code>ec.value()</code>.</li>
</ul>
<p>if <code>&amp;ec != &amp;throws</code> and an error did not occur, <code>ec.clear()</code>.</p>
</blockquote>
<p><i>Throws:</i></p>
<blockquote>
<p>If an error occurs and <code>&amp;ec == &amp;throws</code>, throws an exception of type
<code><a href="#Class-system_error">system_error</a></code> or of a type
derived from <code><a href="#Class-system_error">system_error</a></code>. The
exception's <code>code()</code> member function returns a reference to an
<code>error_code</code> object with the behavior specified in <i>
Postconditions</i>.</p>
</blockquote>
</blockquote>
<h2><a name="Non-member-functions">Non-member functions</a></h2>
<pre>bool operator==( const error_code &amp; lhs, const error_code &amp; rhs ) noexcept;</pre>
@@ -736,6 +708,37 @@ bool operator!=( const error_condition &amp; condition, const error_code &amp; c
<p><i>Returns: </i>&nbsp;A hash value representing <code>ec</code>.</p>
</blockquote>
<h2><a name="Function-boost-throws">Function <code>boost::throws()</code></a></h2>
<pre>system::error_code&amp; throws();</pre>
<blockquote>
<p><i>Returns:</i> A <code>system::error_code</code> reference
for use in some user-defined function signature as a &quot;throw on error&quot; tag.</p>
<p><i>Remark:</i> The only valid use for the returned reference is to test its
address for equality or inequality to the address of the reference returned by
another call to throws(). The returned reference itself has been poisoned so
that an attempt to dereference it will fail.</p>
<p>[<i>Example: </i>Example of a function that uses the <code>throws()</code> idiom:</p>
<blockquote>
<pre>int divide(int dividend, int divisor,
boost::system::error_code&amp; ec = boost::throws())
{
if (divisor == 0) // is there an error?
{
if (&amp;ec == &amp;boost::throws()) // throw on error
throw &quot;oops!&quot;; // whatever exception you prefer
ec = error_code(EDOM, generic_category()); // report error via error_code
return 0;
}
if (&amp;ec != &amp;boost::throws()) // error reporting via error_code
ec.clear();
return dividend / divisor;
}</pre>
</blockquote>
<p>&mdash; <i>end Example</i>]</p>
</blockquote>
<h2><a name="Header-system_error">Header &lt;boost/system/system_error.hpp&gt;</a></h2>
<h3><a name="Class-system_error">Class <code>
@@ -818,7 +821,7 @@ application program interfaces.</p>
<hr>
<p>Revised
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%B %d, %Y" startspan -->January 06, 2014<!--webbot bot="Timestamp" endspan i-checksum="31400" --> </font>
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%B %d, %Y" startspan -->September 07, 2017<!--webbot bot="Timestamp" endspan i-checksum="38006" --> </font>
</p>
<p>© Copyright Beman Dawes, 2006, 2007, 2008, 2013</p>
+31 -26
View File
@@ -21,9 +21,9 @@
#include <cstring> // for strerror/strerror_r
# if defined( BOOST_WINDOWS_API )
# include <boost/detail/winapi/error_codes.hpp>
# include <boost/detail/winapi/error_handling.hpp>
# include <boost/detail/winapi/character_code_conversion.hpp>
# include <boost/winapi/error_codes.hpp>
# include <boost/winapi/error_handling.hpp>
# include <boost/winapi/character_code_conversion.hpp>
# if !BOOST_PLAT_WINDOWS_RUNTIME
# include <boost/system/detail/local_free_on_destruction.hpp>
# endif
@@ -154,7 +154,6 @@ namespace
# endif
if ( sz > sizeof(buf) ) std::free( bp );
sz = 0;
return msg;
# endif // else POSIX version of strerror_r
# endif // else use strerror_r
@@ -187,7 +186,7 @@ namespace
# if defined(BOOST_WINDOWS_API)
using namespace boost::detail::winapi; // for error codes
using namespace boost::winapi; // for error codes
# endif
@@ -383,15 +382,15 @@ namespace
std::wstring buf(128, wchar_t());
for (;;)
{
boost::detail::winapi::DWORD_ retval = boost::detail::winapi::FormatMessageW(
boost::detail::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
boost::detail::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
boost::winapi::DWORD_ retval = boost::winapi::FormatMessageW(
boost::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
boost::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
boost::detail::winapi::MAKELANGID_(boost::detail::winapi::LANG_NEUTRAL_,
boost::detail::winapi::SUBLANG_DEFAULT_), // Default language
boost::winapi::MAKELANGID_(boost::winapi::LANG_NEUTRAL_,
boost::winapi::SUBLANG_DEFAULT_), // Default language
&buf[0],
buf.size(),
static_cast<boost::winapi::DWORD_>(buf.size()),
NULL
);
@@ -400,8 +399,8 @@ namespace
buf.resize(retval);
break;
}
else if (boost::detail::winapi::GetLastError() !=
boost::detail::winapi::ERROR_INSUFFICIENT_BUFFER_)
else if (boost::winapi::GetLastError() !=
boost::winapi::ERROR_INSUFFICIENT_BUFFER_)
{
return std::string("Unknown error");
}
@@ -412,9 +411,15 @@ namespace
}
int num_chars = (buf.size() + 1) * 2;
boost::detail::winapi::LPSTR_ narrow_buffer =
(boost::detail::winapi::LPSTR_)_alloca(num_chars);
if (boost::detail::winapi::WideCharToMultiByte(boost::detail::winapi::CP_ACP_, 0,
boost::winapi::LPSTR_ narrow_buffer =
#if defined(__GNUC__)
(boost::winapi::LPSTR_)__builtin_alloca(num_chars);
#else
(boost::winapi::LPSTR_)_alloca(num_chars);
#endif
if (boost::winapi::WideCharToMultiByte(boost::winapi::CP_ACP_, 0,
buf.c_str(), -1, narrow_buffer, num_chars, NULL, NULL) == 0)
{
return std::string("Unknown error");
@@ -422,16 +427,16 @@ namespace
std::string str( narrow_buffer );
#else
boost::detail::winapi::LPVOID_ lpMsgBuf = 0;
boost::detail::winapi::DWORD_ retval = boost::detail::winapi::FormatMessageA(
boost::detail::winapi::FORMAT_MESSAGE_ALLOCATE_BUFFER_ |
boost::detail::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
boost::detail::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
boost::winapi::LPVOID_ lpMsgBuf = 0;
boost::winapi::DWORD_ retval = boost::winapi::FormatMessageA(
boost::winapi::FORMAT_MESSAGE_ALLOCATE_BUFFER_ |
boost::winapi::FORMAT_MESSAGE_FROM_SYSTEM_ |
boost::winapi::FORMAT_MESSAGE_IGNORE_INSERTS_,
NULL,
ev,
boost::detail::winapi::MAKELANGID_(boost::detail::winapi::LANG_NEUTRAL_,
boost::detail::winapi::SUBLANG_DEFAULT_), // Default language
(boost::detail::winapi::LPSTR_) &lpMsgBuf,
boost::winapi::MAKELANGID_(boost::winapi::LANG_NEUTRAL_,
boost::winapi::SUBLANG_DEFAULT_), // Default language
(boost::winapi::LPSTR_) &lpMsgBuf,
0,
NULL
);
@@ -439,7 +444,7 @@ namespace
if (retval == 0)
return std::string("Unknown error");
std::string str(static_cast<boost::detail::winapi::LPCSTR_>(lpMsgBuf));
std::string str(static_cast<boost::winapi::LPCSTR_>(lpMsgBuf));
# endif
while ( str.size()
&& (str[str.size()-1] == '\n' || str[str.size()-1] == '\r') )
@@ -453,7 +458,7 @@ namespace
} // unnamed namespace
# ifndef BOOST_SYSTEM_NO_DEPRECATED
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
BOOST_SYSTEM_DECL error_code throws; // "throw on error" special error_code;
// note that it doesn't matter if this
// isn't initialized before use since
@@ -12,7 +12,7 @@
#ifndef BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
#define BOOST_SYSTEM_LOCAL_FREE_ON_EXIT_HPP
#include <boost/detail/winapi/local_memory.hpp>
#include <boost/winapi/local_memory.hpp>
namespace boost {
namespace system {
@@ -26,7 +26,7 @@ public:
~local_free_on_destruction()
{
boost::detail::winapi::LocalFree(p_);
boost::winapi::LocalFree(p_);
}
private:
+26 -6
View File
@@ -144,7 +144,7 @@ namespace boost
} // namespace errc
# ifndef BOOST_SYSTEM_NO_DEPRECATED
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
namespace posix = errc;
namespace posix_error = errc;
# endif
@@ -198,7 +198,7 @@ namespace boost
#endif
// deprecated synonyms ------------------------------------------------------------//
#ifndef BOOST_SYSTEM_NO_DEPRECATED
#ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
inline const error_category & get_system_category() { return system_category(); }
inline const error_category & get_generic_category() { return generic_category(); }
inline const error_category & get_posix_category() { return generic_category(); }
@@ -210,6 +210,12 @@ namespace boost
= system_category();
#endif
#ifdef BOOST_MSVC
#pragma warning(push)
// 'this' : used in base member initializer list
#pragma warning(disable: 4355)
#endif
// class error_category ------------------------------------------------//
class error_category : public noncopyable
@@ -328,6 +334,10 @@ namespace boost
{ return std::less<const error_category*>()( this, &rhs ); }
};
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
// class error_condition ---------------------------------------------------------//
// error_conditions are portable, error_codes are system or library specific
@@ -523,7 +533,7 @@ namespace boost
};
// predefined error_code object used as "throw on error" tag
# ifndef BOOST_SYSTEM_NO_DEPRECATED
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
BOOST_SYSTEM_DECL extern error_code throws;
# endif
@@ -532,8 +542,9 @@ namespace boost
// "throws" function in namespace boost rather than namespace boost::system.
} // namespace system
namespace detail { inline system::error_code * throws() { return 0; } }
namespace detail
{
// Misuse of the error_code object is turned into a noisy failure by
// poisoning the reference. This particular implementation doesn't
// produce warnings or errors from popular compilers, is very efficient
@@ -541,8 +552,17 @@ namespace boost
// from order of initialization problems. In practice, it also seems
// cause user function error handling implementation errors to be detected
// very early in the development cycle.
inline system::error_code* throws()
{
// See github.com/boostorg/system/pull/12 by visigoth for why the return
// is poisoned with (1) rather than (0). A test, test_throws_usage(), has
// been added to error_code_test.cpp, and as visigoth mentioned it fails
// on clang for release builds with a return of 0 but works fine with (1).
return reinterpret_cast<system::error_code*>(1);
}
}
inline system::error_code & throws()
inline system::error_code& throws()
{ return *detail::throws(); }
namespace system
+1 -1
View File
@@ -89,7 +89,7 @@ namespace boost
};
} // namespace linux_error
# ifndef BOOST_SYSTEM_NO_DEPRECATED
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
namespace Linux = linux_error;
# endif
+52 -52
View File
@@ -28,7 +28,7 @@
//#include <winerror.h>
//#endif
#include <boost/detail/winapi/error_codes.hpp>
#include <boost/winapi/error_codes.hpp>
namespace boost
{
@@ -47,59 +47,59 @@ namespace boost
{
success = 0,
// These names and values are based on Windows winerror.h
invalid_function = boost::detail::winapi::ERROR_INVALID_FUNCTION_,
file_not_found = boost::detail::winapi::ERROR_FILE_NOT_FOUND_,
path_not_found = boost::detail::winapi::ERROR_PATH_NOT_FOUND_,
too_many_open_files = boost::detail::winapi::ERROR_TOO_MANY_OPEN_FILES_,
access_denied = boost::detail::winapi::ERROR_ACCESS_DENIED_,
invalid_handle = boost::detail::winapi::ERROR_INVALID_HANDLE_,
arena_trashed = boost::detail::winapi::ERROR_ARENA_TRASHED_,
not_enough_memory = boost::detail::winapi::ERROR_NOT_ENOUGH_MEMORY_,
invalid_block = boost::detail::winapi::ERROR_INVALID_BLOCK_,
bad_environment = boost::detail::winapi::ERROR_BAD_ENVIRONMENT_,
bad_format = boost::detail::winapi::ERROR_BAD_FORMAT_,
invalid_access = boost::detail::winapi::ERROR_INVALID_ACCESS_,
outofmemory = boost::detail::winapi::ERROR_OUTOFMEMORY_,
invalid_drive = boost::detail::winapi::ERROR_INVALID_DRIVE_,
current_directory = boost::detail::winapi::ERROR_CURRENT_DIRECTORY_,
not_same_device = boost::detail::winapi::ERROR_NOT_SAME_DEVICE_,
no_more_files = boost::detail::winapi::ERROR_NO_MORE_FILES_,
write_protect = boost::detail::winapi::ERROR_WRITE_PROTECT_,
bad_unit = boost::detail::winapi::ERROR_BAD_UNIT_,
not_ready = boost::detail::winapi::ERROR_NOT_READY_,
bad_command = boost::detail::winapi::ERROR_BAD_COMMAND_,
crc = boost::detail::winapi::ERROR_CRC_,
bad_length = boost::detail::winapi::ERROR_BAD_LENGTH_,
seek = boost::detail::winapi::ERROR_SEEK_,
not_dos_disk = boost::detail::winapi::ERROR_NOT_DOS_DISK_,
sector_not_found = boost::detail::winapi::ERROR_SECTOR_NOT_FOUND_,
out_of_paper = boost::detail::winapi::ERROR_OUT_OF_PAPER_,
write_fault = boost::detail::winapi::ERROR_WRITE_FAULT_,
read_fault = boost::detail::winapi::ERROR_READ_FAULT_,
gen_failure = boost::detail::winapi::ERROR_GEN_FAILURE_,
sharing_violation = boost::detail::winapi::ERROR_SHARING_VIOLATION_,
lock_violation = boost::detail::winapi::ERROR_LOCK_VIOLATION_,
wrong_disk = boost::detail::winapi::ERROR_WRONG_DISK_,
sharing_buffer_exceeded = boost::detail::winapi::ERROR_SHARING_BUFFER_EXCEEDED_,
handle_eof = boost::detail::winapi::ERROR_HANDLE_EOF_,
handle_disk_full= boost::detail::winapi::ERROR_HANDLE_DISK_FULL_,
rem_not_list = boost::detail::winapi::ERROR_REM_NOT_LIST_,
dup_name = boost::detail::winapi::ERROR_DUP_NAME_,
bad_net_path = boost::detail::winapi::ERROR_BAD_NETPATH_,
network_busy = boost::detail::winapi::ERROR_NETWORK_BUSY_,
invalid_function = boost::winapi::ERROR_INVALID_FUNCTION_,
file_not_found = boost::winapi::ERROR_FILE_NOT_FOUND_,
path_not_found = boost::winapi::ERROR_PATH_NOT_FOUND_,
too_many_open_files = boost::winapi::ERROR_TOO_MANY_OPEN_FILES_,
access_denied = boost::winapi::ERROR_ACCESS_DENIED_,
invalid_handle = boost::winapi::ERROR_INVALID_HANDLE_,
arena_trashed = boost::winapi::ERROR_ARENA_TRASHED_,
not_enough_memory = boost::winapi::ERROR_NOT_ENOUGH_MEMORY_,
invalid_block = boost::winapi::ERROR_INVALID_BLOCK_,
bad_environment = boost::winapi::ERROR_BAD_ENVIRONMENT_,
bad_format = boost::winapi::ERROR_BAD_FORMAT_,
invalid_access = boost::winapi::ERROR_INVALID_ACCESS_,
outofmemory = boost::winapi::ERROR_OUTOFMEMORY_,
invalid_drive = boost::winapi::ERROR_INVALID_DRIVE_,
current_directory = boost::winapi::ERROR_CURRENT_DIRECTORY_,
not_same_device = boost::winapi::ERROR_NOT_SAME_DEVICE_,
no_more_files = boost::winapi::ERROR_NO_MORE_FILES_,
write_protect = boost::winapi::ERROR_WRITE_PROTECT_,
bad_unit = boost::winapi::ERROR_BAD_UNIT_,
not_ready = boost::winapi::ERROR_NOT_READY_,
bad_command = boost::winapi::ERROR_BAD_COMMAND_,
crc = boost::winapi::ERROR_CRC_,
bad_length = boost::winapi::ERROR_BAD_LENGTH_,
seek = boost::winapi::ERROR_SEEK_,
not_dos_disk = boost::winapi::ERROR_NOT_DOS_DISK_,
sector_not_found = boost::winapi::ERROR_SECTOR_NOT_FOUND_,
out_of_paper = boost::winapi::ERROR_OUT_OF_PAPER_,
write_fault = boost::winapi::ERROR_WRITE_FAULT_,
read_fault = boost::winapi::ERROR_READ_FAULT_,
gen_failure = boost::winapi::ERROR_GEN_FAILURE_,
sharing_violation = boost::winapi::ERROR_SHARING_VIOLATION_,
lock_violation = boost::winapi::ERROR_LOCK_VIOLATION_,
wrong_disk = boost::winapi::ERROR_WRONG_DISK_,
sharing_buffer_exceeded = boost::winapi::ERROR_SHARING_BUFFER_EXCEEDED_,
handle_eof = boost::winapi::ERROR_HANDLE_EOF_,
handle_disk_full= boost::winapi::ERROR_HANDLE_DISK_FULL_,
rem_not_list = boost::winapi::ERROR_REM_NOT_LIST_,
dup_name = boost::winapi::ERROR_DUP_NAME_,
bad_net_path = boost::winapi::ERROR_BAD_NETPATH_,
network_busy = boost::winapi::ERROR_NETWORK_BUSY_,
// ...
file_exists = boost::detail::winapi::ERROR_FILE_EXISTS_,
cannot_make = boost::detail::winapi::ERROR_CANNOT_MAKE_,
file_exists = boost::winapi::ERROR_FILE_EXISTS_,
cannot_make = boost::winapi::ERROR_CANNOT_MAKE_,
// ...
broken_pipe = boost::detail::winapi::ERROR_BROKEN_PIPE_,
open_failed = boost::detail::winapi::ERROR_OPEN_FAILED_,
buffer_overflow = boost::detail::winapi::ERROR_BUFFER_OVERFLOW_,
disk_full= boost::detail::winapi::ERROR_DISK_FULL_,
broken_pipe = boost::winapi::ERROR_BROKEN_PIPE_,
open_failed = boost::winapi::ERROR_OPEN_FAILED_,
buffer_overflow = boost::winapi::ERROR_BUFFER_OVERFLOW_,
disk_full= boost::winapi::ERROR_DISK_FULL_,
// ...
lock_failed = boost::detail::winapi::ERROR_LOCK_FAILED_,
busy = boost::detail::winapi::ERROR_BUSY_,
cancel_violation = boost::detail::winapi::ERROR_CANCEL_VIOLATION_,
already_exists = boost::detail::winapi::ERROR_ALREADY_EXISTS_
lock_failed = boost::winapi::ERROR_LOCK_FAILED_,
busy = boost::winapi::ERROR_BUSY_,
cancel_violation = boost::winapi::ERROR_CANCEL_VIOLATION_,
already_exists = boost::winapi::ERROR_ALREADY_EXISTS_
// ...
// TODO: add more Windows errors
@@ -107,7 +107,7 @@ namespace boost
} // namespace windows
# ifndef BOOST_SYSTEM_NO_DEPRECATED
# ifdef BOOST_SYSTEM_ENABLE_DEPRECATED
namespace windows = windows_error;
# endif
+6
View File
@@ -121,4 +121,10 @@ project
[ run std_mismatch_test.cpp
: : : <link>shared <conditional>@cxx11 : std_mismatch_test_shared_11
]
[ run header_only_test.cpp
: : : <link>static <define>BOOST_NO_ANSI_APIS : header_only_test_no_ansi
]
;
# Quick (CI) test
run quick.cpp ;
+49 -3
View File
@@ -9,9 +9,6 @@
//----------------------------------------------------------------------------//
// test without deprecated features
#define BOOST_SYSTEM_NO_DEPRECATED
#include <boost/config/warning_disable.hpp>
#include <boost/detail/lightweight_test.hpp>
@@ -56,6 +53,53 @@ namespace
ss >> s;
BOOST_TEST( s == expected );
}
// throws_function_test ------------------------------------------------------------//
// usage example
int divide(int dividend, int divisor, boost::system::error_code& ec = boost::throws())
{
if (divisor == 0) // is there an error?
{
if (&ec == &boost::throws()) // throw on error
throw "oops!"; // whatever exception you prefer
ec = error_code(EDOM, generic_category()); // report error via error_code
return 0;
}
if (&ec != &boost::throws()) // error reporting via error_code
ec.clear();
return dividend / divisor;
}
// test usage example
void test_throws_usage()
{
std::cout << "Test throws() example and usage...\n";
error_code ec;
// no error tests
BOOST_TEST_EQ((divide(10, 2)), 5); // no error, report via exception
ec = make_error_code(errc::argument_out_of_domain);
BOOST_TEST_EQ((divide(10, 5, ec)), 2); // no error, report via error_code
BOOST_TEST(!ec);
ec = make_error_code(errc::argument_out_of_domain);
BOOST_TEST_EQ((divide(10, 0, ec)), 0); // error, report via error_code
BOOST_TEST(ec);
bool exception_thrown = false;
try
{ divide(10, 0); } // error, report via exception
catch (...)
{ exception_thrown = true; }
BOOST_TEST(exception_thrown);
//error_code should_fail(boost::throws()); // should fail at runtime
//boost::throws() = ec; // should fail at runtime
}
}
// main ------------------------------------------------------------------------------//
@@ -202,6 +246,8 @@ int main( int, char ** )
BOOST_TEST( econd.message() != "" );
BOOST_TEST( econd.message().substr( 0, 13) != "Unknown error" );
test_throws_usage();
#ifdef BOOST_WINDOWS_API
std::cout << "Windows tests...\n";
// these tests probe the Windows errc decoder
-2
View File
@@ -14,8 +14,6 @@
// Motivation was a Boost posting by Christopher Kohlhoff on June 28, 2006.
#define BOOST_SYSTEM_NO_DEPRECATED
#include <boost/system/error_code.hpp>
#include <boost/cerrno.hpp>
#include <string>
+1 -1
View File
@@ -18,7 +18,7 @@ struct foo
foo()
{
boost::system::error_code ec;
ec == boost::system::posix::permission_denied;
ec == boost::system::errc::permission_denied;
}
} f;
+36
View File
@@ -0,0 +1,36 @@
// Copyright 2017 Peter Dimov.
//
// 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
// See library home page at http://www.boost.org/libs/system
#include <boost/system/error_code.hpp>
#include <boost/core/lightweight_test.hpp>
#include <cerrno>
int main()
{
boost::system::error_category const & bt = boost::system::generic_category();
int ev = ENOENT;
boost::system::error_code bc( ev, bt );
BOOST_TEST_EQ( bc.value(), ev );
BOOST_TEST_EQ( &bc.category(), &bt );
boost::system::error_condition bn = bt.default_error_condition( ev );
BOOST_TEST_EQ( bn.value(), ev );
BOOST_TEST_EQ( &bn.category(), &bt );
BOOST_TEST( bt.equivalent( ev, bn ) );
BOOST_TEST_EQ( bc, bn );
return boost::report_errors();
}
-3
View File
@@ -9,9 +9,6 @@
//----------------------------------------------------------------------------//
// test without deprecated features
#define BOOST_SYSTEM_NO_DEPRECATED
#include <boost/config/warning_disable.hpp>
#include <boost/detail/lightweight_test.hpp>