forked from boostorg/static_assert
Compare commits
42 Commits
svn-branch
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
6ea570bd65 | |||
b060c8ce72 | |||
8b819d5c6c | |||
bc5065e495 | |||
1663a635aa | |||
b9a3b24aef | |||
a0dac351fb | |||
c68b2114de | |||
48b6934f7f | |||
d0fe5bc897 | |||
6541c76677 | |||
098770b91d | |||
1b9f71f4dd | |||
f7531de553 | |||
11be1f5a93 | |||
3959c96e26 | |||
178eed53c2 | |||
81625fade8 | |||
811af44dd5 | |||
2cf2951f97 | |||
f60bc26f84 | |||
f0969644d0 | |||
68545773d5 | |||
328b4fee16 | |||
21ab9ce12a | |||
0e39de168b | |||
52bc1a8fb7 | |||
0566bafd1d | |||
a2c78d51be | |||
d06c7261fc | |||
5e7c100b55 | |||
c26dde8e6e | |||
19e8840ad7 | |||
dd969b13ab | |||
5ea5535e1a | |||
64973e2132 | |||
02c6fb40a6 | |||
5ea88d2e64 | |||
1029ee8032 | |||
f2732e699f | |||
9d3c2ed75f | |||
38b5799e33 |
16
Jamfile
16
Jamfile
@ -1,16 +0,0 @@
|
||||
subproject libs/static_assert ;
|
||||
|
||||
|
||||
unit-test static_assert_test : static_assert_test.cpp
|
||||
: <include>$(BOOST_ROOT) : ;
|
||||
|
||||
unit-test static_assert_example_1 : static_assert_example_1.cpp
|
||||
: <include>$(BOOST_ROOT) : ;
|
||||
|
||||
unit-test static_assert_example_2 : static_assert_example_2.cpp
|
||||
: <include>$(BOOST_ROOT) : ;
|
||||
|
||||
unit-test static_assert_example_3 : static_assert_example_3.cpp
|
||||
: <include>$(BOOST_ROOT) : ;
|
||||
|
||||
|
31
Jamfile.v2
Normal file
31
Jamfile.v2
Normal file
@ -0,0 +1,31 @@
|
||||
# copyright John Maddock 2003
|
||||
# Use, modification and distribution are subject to 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)
|
||||
|
||||
# bring in the rules for testing
|
||||
import testing ;
|
||||
|
||||
test-suite static_assert :
|
||||
[ run static_assert_test.cpp ]
|
||||
# [ run static_assert_example_1.cpp ]
|
||||
[ run static_assert_example_2.cpp ]
|
||||
[ run static_assert_example_3.cpp ]
|
||||
[ compile-fail static_assert_test_fail_1.cpp ]
|
||||
[ compile-fail static_assert_test_fail_2.cpp ]
|
||||
[ compile-fail static_assert_test_fail_3.cpp ]
|
||||
[ compile-fail static_assert_test_fail_4.cpp ]
|
||||
[ compile-fail static_assert_test_fail_5.cpp ]
|
||||
[ compile-fail static_assert_test_fail_6.cpp ]
|
||||
[ compile-fail static_assert_test_fail_7.cpp ]
|
||||
[ compile-fail static_assert_test_fail_8.cpp ]
|
||||
[ compile-fail static_assert_test_fail_9.cpp ]
|
||||
[ compile-fail static_assert_test_fail_10.cpp ]
|
||||
;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
20
doc/Jamfile.v2
Normal file
20
doc/Jamfile.v2
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
# Copyright John Maddock 2005. Use, modification, and distribution are
|
||||
# subject to 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)
|
||||
|
||||
using quickbook ;
|
||||
|
||||
xml static_assert : static_assert.qbk ;
|
||||
boostbook standalone
|
||||
:
|
||||
static_assert
|
||||
:
|
||||
<xsl:param>nav.layout=none
|
||||
<xsl:param>navig.graphics=0
|
||||
;
|
||||
|
||||
install html : ../../../doc/html/boostbook.css ;
|
||||
install ../ : ../../../boost.png ;
|
||||
|
||||
|
230
doc/static_assert.qbk
Normal file
230
doc/static_assert.qbk
Normal file
@ -0,0 +1,230 @@
|
||||
[library Boost.StaticAssert
|
||||
[copyright 2000 2005 Steve Cleary and John Maddock]
|
||||
[purpose Compile time diagnostics library]
|
||||
[license
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(See accompanying file LICENSE_1_0.txt or copy at
|
||||
<ulink url="http://www.boost.org/LICENSE_1_0.txt">
|
||||
http://www.boost.org/LICENSE_1_0.txt
|
||||
</ulink>)
|
||||
]
|
||||
[authors [Maddock, John], [Cleary, Steve]]
|
||||
[category template]
|
||||
[category testing]
|
||||
[category generic]
|
||||
[last-revision $Date$]
|
||||
]
|
||||
|
||||
This manual is also available in
|
||||
[@http:svn.boost.org/svn/boost/sandbox/pdf/static_assert/release/static_assert.pdf
|
||||
printer friendly PDF format].
|
||||
|
||||
[section:intro Overview and Tutorial]
|
||||
|
||||
The header `<boost/static_assert.hpp>` supplies a single macro `BOOST_STATIC_ASSERT(x)`,
|
||||
which generates a compile time error message if the integral-constant-expression `x`
|
||||
is not true. In other words it is the compile time equivalent of the assert macro;
|
||||
this is sometimes known as a "compile-time-assertion", but will be called a
|
||||
"static assertion" throughout these docs. Note that if the condition is `true`,
|
||||
then the macro will generate neither code nor data - and the macro can also
|
||||
be used at either namespace, class or function scope. When used in a template,
|
||||
the static assertion will be evaluated at the time the template is instantiated;
|
||||
this is particularly useful for validating template parameters.
|
||||
|
||||
One of the aims of `BOOST_STATIC_ASSERT` is to generate readable error messages.
|
||||
These immediately tell the user that a library is being used in a manner that
|
||||
is not supported. While error messages obviously differ from compiler to compiler,
|
||||
but you should see something like:
|
||||
|
||||
Illegal use of STATIC_ASSERTION_FAILURE<false>
|
||||
|
||||
Which is intended to at least catch the eye!
|
||||
|
||||
You can use `BOOST_STATIC_ASSERT` at any place where you can place a declaration,
|
||||
that is at class, function or namespace scope, this is illustrated by the
|
||||
following examples:
|
||||
|
||||
[section:namespace Use at namespace scope.]
|
||||
|
||||
The macro can be used at namespace scope, if there is some requirement must
|
||||
always be true; generally this means some platform specific requirement.
|
||||
Suppose we require that `int` be at least a 32-bit integral type, and that `wchar_t`
|
||||
be an unsigned type. We can verify this at compile time as follows:
|
||||
|
||||
#include <climits>
|
||||
#include <cwchar>
|
||||
#include <limits>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
namespace my_conditions {
|
||||
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
|
||||
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
|
||||
|
||||
} // namespace my_conditions
|
||||
|
||||
The use of the namespace my_conditions here requires some comment.
|
||||
The macro `BOOST_STATIC_ASSERT` works by generating an typedef declaration,
|
||||
and since the typedef must have a name, the macro generates one automatically by
|
||||
mangling a stub name with the value of `__LINE__`. When `BOOST_STATIC_ASSERT` is
|
||||
used at either class or function scope then each use of `BOOST_STATIC_ASSERT`
|
||||
is guaranteed to produce a name unique to that scope (provided you only use
|
||||
the macro once on each line). However when used in a header at namespace
|
||||
scope, that namespace can be continued over multiple headers, each of which
|
||||
may have their own static assertions, and on the "same" lines, thereby generating
|
||||
duplicate declarations. In theory the compiler should silently ignore duplicate
|
||||
typedef declarations, however many do not do so (and even if they do they are
|
||||
entitled to emit warnings in such cases). To avoid potential problems, if you
|
||||
use `BOOST_STATIC_ASSERT` in a header and at namespace scope, then enclose
|
||||
them in a namespace unique to that header.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:function Use at function scope]
|
||||
|
||||
The macro is typically used at function scope inside template functions,
|
||||
when the template arguments need checking. Imagine that we have an
|
||||
iterator-based algorithm that requires random access iterators.
|
||||
If the algorithm is instantiated with iterators that do not meet our
|
||||
requirements then an error will be generated eventually, but this may
|
||||
be nested deep inside several templates, making it hard for the user to
|
||||
determine what went wrong. One option is to add a static assertion at
|
||||
the top level of the template, in that case if the condition is not met,
|
||||
then an error will be generated in a way that makes it reasonably obvious to
|
||||
the user that the template is being misused.
|
||||
|
||||
#include <iterator>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
|
||||
template <class RandomAccessIterator >
|
||||
RandomAccessIterator foo(RandomAccessIterator from,
|
||||
RandomAccessIterator to)
|
||||
{
|
||||
// this template can only be used with
|
||||
// random access iterators...
|
||||
typedef typename std::iterator_traits<
|
||||
RandomAccessIterator >::iterator_category cat;
|
||||
BOOST_STATIC_ASSERT(
|
||||
(boost::is_convertible<
|
||||
cat,
|
||||
const std::random_access_iterator_tag&>::value));
|
||||
//
|
||||
// detail goes here...
|
||||
return from;
|
||||
}
|
||||
|
||||
A couple of footnotes are in order here: the extra set of parenthesis around the
|
||||
assert, is to prevent the comma inside the `is_convertible` template being
|
||||
interpreted by the preprocessor as a macro argument separator; the target type
|
||||
for `is_convertible` is a reference type, as some compilers have problems
|
||||
using `is_convertible` when the conversion is via a user defined constructor
|
||||
(in any case there is no guarantee that the iterator tag classes are
|
||||
copy-constructible).
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:class Use at class scope]
|
||||
|
||||
The macro is typically used inside classes that are templates.
|
||||
Suppose we have a template-class that requires an unsigned integral type with
|
||||
at least 16-bits of precision as a template argument, we can achieve this
|
||||
using something like this:
|
||||
|
||||
#include <climits>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
template <class UnsignedInt>
|
||||
class myclass
|
||||
{
|
||||
private:
|
||||
BOOST_STATIC_ASSERT((std::numeric_limits<UnsignedInt>::digits >= 16)
|
||||
&& std::numeric_limits<UnsignedInt>::is_specialized
|
||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
||||
public:
|
||||
/* details here */
|
||||
};
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:templates Use in templates]
|
||||
|
||||
Normally static assertions when used inside a class or function template,
|
||||
will not be instantiated until the template in which it is used is instantiated.
|
||||
However, there is one potential problem to watch out for: if the static assertion
|
||||
is not dependent upon one or more template parameters, then the compiler is
|
||||
permitted to evaluate the static assertion at the point it is first seen,
|
||||
irrespective of whether the template is ever instantiated, for example:
|
||||
|
||||
template <class T>
|
||||
struct must_not_be_instantiated
|
||||
{
|
||||
BOOST_STATIC_ASSERT(false);
|
||||
};
|
||||
|
||||
Will produce a compiler error with some compilers (for example Intel 8.1
|
||||
or gcc 3.4), regardless of whether the template is ever instantiated. A
|
||||
workaround in cases like this is to force the assertion to be dependent
|
||||
upon a template parameter:
|
||||
|
||||
template <class T>
|
||||
struct must_not_be_instantiated
|
||||
{
|
||||
// this will be triggered if this type is instantiated
|
||||
BOOST_STATIC_ASSERT(sizeof(T) == 0);
|
||||
};
|
||||
|
||||
|
||||
[endsect]
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:how How it works]
|
||||
|
||||
`BOOST_STATIC_ASSERT` works as follows. There is class `STATIC_ASSERTION_FAILURE`
|
||||
which is defined as:
|
||||
|
||||
namespace boost{
|
||||
|
||||
template <bool> struct STATIC_ASSERTION_FAILURE;
|
||||
|
||||
template <> struct STATIC_ASSERTION_FAILURE<true>{};
|
||||
|
||||
}
|
||||
|
||||
The key feature is that the error message triggered by the undefined
|
||||
expression `sizeof(STATIC_ASSERTION_FAILURE<0>)`, tends to be consistent
|
||||
across a wide variety of compilers. The rest of the machinery of
|
||||
`BOOST_STATIC_ASSERT` is just a way to feed the `sizeof` expression into a `typedef`.
|
||||
The use of a macro here is somewhat ugly; however boost members have spent
|
||||
considerable effort trying to invent a static assert that avoided macros,
|
||||
all to no avail. The general conclusion was that the good of a static assert
|
||||
working at namespace, function, and class scope outweighed the ugliness of a macro.
|
||||
|
||||
[endsect]
|
||||
|
||||
[section:test Test Programs]
|
||||
|
||||
[table Test programs provided with static_assert
|
||||
[[Test Program][Expected to Compile][Description]]
|
||||
|
||||
[[[@/libs/static_assert/static_assert_test.cpp static_assert_test.cpp]] [Yes] [Illustrates usage, and should always compile, really just tests compiler compatibility.]]
|
||||
[[[@/libs/static_assert/static_assert_example_1.cpp static_assert_example_1.cpp]] [Platform dependent.] [Namespace scope test program, may compile depending upon the platform. ]]
|
||||
[[[@/libs/static_assert/static_assert_example_2.cpp static_assert_example_2.cpp]] [Yes] [Function scope test program. ]]
|
||||
[[[@/libs/static_assert/static_assert_example_3.cpp static_assert_example_3.cpp]] [Yes] [Class scope test program. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_1.cpp static_assert_test_fail_1.cpp]] [No] [Illustrates failure at namespace scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_2.cpp static_assert_test_fail_2.cpp]] [No] [Illustrates failure at non-template function scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_3.cpp static_assert_test_fail_3.cpp]] [No] [Illustrates failure at non-template class scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_4.cpp static_assert_test_fail_4.cpp]] [No] [Illustrates failure at non-template class scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_5.cpp static_assert_test_fail_5.cpp]] [No] [Illustrates failure at template class scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_6.cpp static_assert_test_fail_6.cpp]] [No] [Illustrates failure at template class member function scope. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_7.cpp static_assert_test_fail_7.cpp]] [No] [Illustrates failure of class scope example. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_8.cpp static_assert_test_fail_8.cpp]] [No] [Illustrates failure of function scope example. ]]
|
||||
[[[@/libs/static_assert/static_assert_test_fail_9.cpp static_assert_test_fail_9.cpp]] [No] [Illustrates failure of function scope example (part 2). ]]
|
||||
|
||||
]
|
||||
|
||||
[endsect]
|
||||
|
||||
|
@ -1,10 +1,9 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
// See http://www.boost.org/libs/static_assert for documentation.
|
||||
|
||||
/*
|
||||
Revision history:
|
||||
@ -16,6 +15,7 @@
|
||||
#define BOOST_STATIC_ASSERT_HPP
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
//
|
||||
@ -23,12 +23,31 @@
|
||||
#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))
|
||||
// gcc 3.3 and 3.4 don't produce good error messages with the default version:
|
||||
# define BOOST_SA_GCC_WORKAROUND
|
||||
#endif
|
||||
|
||||
//
|
||||
// If the compiler issues warnings about old C style casts,
|
||||
// then enable this:
|
||||
//
|
||||
#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))
|
||||
# define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) == 0 ? false : true)
|
||||
#else
|
||||
# define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
|
||||
#endif
|
||||
|
||||
#ifdef BOOST_HAS_STATIC_ASSERT
|
||||
# define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
|
||||
#else
|
||||
|
||||
namespace boost{
|
||||
|
||||
// HP aCC cannot deal with missing names for template value parameters
|
||||
template <bool x> struct STATIC_ASSERTION_FAILURE;
|
||||
|
||||
template <> struct STATIC_ASSERTION_FAILURE<true>{};
|
||||
template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
|
||||
|
||||
// HP aCC cannot deal with missing names for template value parameters
|
||||
template<int x> struct static_assert_test{};
|
||||
@ -57,30 +76,57 @@ template<int x> struct static_assert_test{};
|
||||
// style casts: too many compilers currently have problems with static_cast
|
||||
// when used inside integral constant expressions.
|
||||
//
|
||||
#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS) && !defined(__MWERKS__)
|
||||
#ifndef BOOST_MSVC
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
typedef ::boost::static_assert_test<\
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
|
||||
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
|
||||
#else
|
||||
#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
|
||||
|
||||
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
|
||||
// __LINE__ macro broken when -ZI is used see Q199057
|
||||
// fortunately MSVC ignores duplicate typedef's.
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
typedef ::boost::static_assert_test<\
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\
|
||||
> boost_static_assert_typedef_
|
||||
#elif defined(BOOST_MSVC)
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
typedef ::boost::static_assert_test<\
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
|
||||
BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
|
||||
#elif defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)
|
||||
// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error
|
||||
// instead of warning in case of failure
|
||||
# define BOOST_STATIC_ASSERT( B ) \
|
||||
typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
|
||||
[ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]
|
||||
#elif defined(__sgi)
|
||||
// special version for SGI MIPSpro compiler
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
BOOST_STATIC_CONSTANT(bool, \
|
||||
BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \
|
||||
typedef ::boost::static_assert_test<\
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< \
|
||||
BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\
|
||||
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
|
||||
#elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
|
||||
// special version for CodeWarrior <= 8.x
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
BOOST_STATIC_CONSTANT(int, \
|
||||
BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )
|
||||
#else
|
||||
// generic version
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
typedef ::boost::static_assert_test<\
|
||||
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
|
||||
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
|
||||
#endif
|
||||
|
||||
#else
|
||||
// alternative enum based implementation:
|
||||
#define BOOST_STATIC_ASSERT( B ) \
|
||||
enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
|
||||
= sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
|
||||
#endif
|
||||
|
||||
#endif // ndef BOOST_HAS_STATIC_ASSERT
|
||||
|
||||
#endif // BOOST_STATIC_ASSERT_HPP
|
||||
|
||||
|
||||
|
||||
|
||||
|
18
index.html
Normal file
18
index.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; URL=../../doc/html/boost_staticassert.html">
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="../../doc/html/boost_staticassert.html">../../doc/html/boost_staticassert.html</a>
|
||||
or view the online version at
|
||||
<a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html">
|
||||
http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html</a>
|
||||
<P>Copyright John Maddock 2006</P>
|
||||
<P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt">
|
||||
LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -1,279 +1,18 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=iso-8859-1">
|
||||
<meta name="Template"
|
||||
content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
|
||||
<title>static assertions</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
|
||||
vlink="#800080">
|
||||
|
||||
<h1><img src="../../c++boost.gif" width="276" height="86">Header
|
||||
<<a href="../../boost/static_assert.hpp">boost/static_assert.hpp</a>></h1>
|
||||
|
||||
<p>The header <boost/static_assert.hpp> supplies a single
|
||||
macro BOOST_STATIC_ASSERT(x), which generates a compile time
|
||||
error message if the <a
|
||||
href="../../more/int_const_guidelines.htm">integral-constant-expression</a>
|
||||
<i>x</i> is not true. In other words it is the compile time
|
||||
equivalent of the assert macro; this is sometimes known as a
|
||||
"compile-time-assertion", but will be called a "static
|
||||
assertion" throughout these docs. Note that if the condition
|
||||
is true, then the macro will generate neither code nor data - and
|
||||
the macro can also be used at either namespace, class or function
|
||||
scope. When used in a template, the static assertion will be
|
||||
evaluated at the time the template is instantiated; this is
|
||||
particularly useful for validating template parameters. </p>
|
||||
|
||||
<p>One of the aims of BOOST_STATIC_ASSERT is to generate readable
|
||||
error messages. These immediately tell the user that a library is
|
||||
being used in a manner that is not supported. While error
|
||||
messages obviously differ from compiler to compiler, but you
|
||||
should see something like: </p>
|
||||
|
||||
<pre>Illegal use of COMPILE_TIME_ASSERTION_FAILURE<false></pre>
|
||||
|
||||
<p>Which is intended to at least catch the eye!</p>
|
||||
|
||||
<p>You can use BOOST_STATIC_ASSERT at any place where you can
|
||||
place a declaration, that is at <a href="#class">class</a>, <a
|
||||
href="#function">function</a> or <a href="#namespace">namespace</a>
|
||||
scope, this is illustrated by the following examples:</p>
|
||||
|
||||
<h3><a name="namespace"></a>Use at namespace scope.</h3>
|
||||
|
||||
<p>The macro can be used at namespace scope, if there is some
|
||||
requirement must always be true; generally this means some
|
||||
platform specific requirement. Suppose we require that <b>int</b>
|
||||
be at least a 32-bit integral type, and that <b>wchar_t</b> be an
|
||||
unsigned type. We can verify this at compile time as follows:</p>
|
||||
|
||||
<pre>#include <climits>
|
||||
#include <cwchar>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
namespace my_conditions {
|
||||
|
||||
BOOST_STATIC_ASSERT(sizeof(int) * CHAR_BIT >= 32);
|
||||
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
|
||||
|
||||
} // namespace my_conditions
|
||||
</pre>
|
||||
|
||||
<p>The use of the namespace <i>my_conditions</i> here requires
|
||||
some comment. The macro BOOST_STATIC_ASSERT works by generating
|
||||
an <strong>typedef</strong> declaration, and since the typedef
|
||||
must have a name, the macro generates one automatically by
|
||||
mangling a stub name with the value of __LINE__. When
|
||||
BOOST_STATIC_ASSERT is used at either class or function scope
|
||||
then each use of BOOST_STATIC_ASSERT is guaranteed to produce a
|
||||
name unique to that scope (provided you only use the macro once
|
||||
on each line). However when used in a header at namespace scope,
|
||||
that namespace can be continued over multiple headers, each of
|
||||
which may have their own static assertions, and on the "same"
|
||||
lines, thereby generating duplicate declarations. In theory the
|
||||
compiler should silently ignore duplicate typedef declarations,
|
||||
however many do not do so (and even if they do they are entitled
|
||||
to emit warnings in such cases). To avoid potential problems, if
|
||||
you use BOOST_STATIC_ASSERT in a header and at namespace scope,
|
||||
then enclose them in a namespace unique to that header.</p>
|
||||
|
||||
<h3><a name="function"></a>Use at function scope</h3>
|
||||
|
||||
<p>The macro is typically used at function scope inside template
|
||||
functions, when the template arguments need checking. Imagine
|
||||
that we have an iterator-based algorithm that requires random
|
||||
access iterators. If the algorithm is instantiated with iterators
|
||||
that do not meet our requirements then an error will be generated
|
||||
eventually, but this may be nested deep inside several templates,
|
||||
making it hard for the user to determine what went wrong. One
|
||||
option is to add a static assertion at the top level of the
|
||||
template, in that case if the condition is not met, then an error
|
||||
will be generated in a way that makes it reasonably obvious to
|
||||
the user that the template is being misused.</p>
|
||||
|
||||
<pre>#include <iterator>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
|
||||
template <class RandomAccessIterator >
|
||||
RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator to)
|
||||
{
|
||||
// this template can only be used with
|
||||
// random access iterators...
|
||||
typedef typename std::iterator_traits< RandomAccessIterator >::iterator_category cat;
|
||||
BOOST_STATIC_ASSERT((boost::is_convertible<cat, const std::random_access_iterator_tag&>::value));
|
||||
//
|
||||
// detail goes here...
|
||||
return from;
|
||||
}</pre>
|
||||
|
||||
<p>A couple of footnotes are in order here: the extra set of
|
||||
parenthesis around the assert, is to prevent the comma inside the
|
||||
is_convertible template being interpreted by the preprocessor as
|
||||
a macro argument separator; the target type for is_convertible is
|
||||
a reference type, as some compilers have problems using
|
||||
is_convertible when the conversion is via a user defined
|
||||
constructor (in any case there is no guarantee that the iterator
|
||||
tag classes are copy-constructible).</p>
|
||||
|
||||
<h3><a name="class"></a>Use at class scope</h3>
|
||||
|
||||
<p>The macro is typically used inside classes that are templates.
|
||||
Suppose we have a template-class that requires an unsigned
|
||||
integral type with at least 16-bits of precision as a template
|
||||
argument, we can achieve this using something like this:</p>
|
||||
|
||||
<pre>#include <climits>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
template <class UnsignedInt>
|
||||
class myclass
|
||||
{
|
||||
private:
|
||||
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
|
||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
||||
public:
|
||||
/* details here */
|
||||
};
|
||||
</pre>
|
||||
|
||||
<h3>How it works</h3>
|
||||
|
||||
<p>BOOST_STATIC_ASSERT works as follows. There is class
|
||||
STATIC_ASSERTION_FAILURE which is defined as:</p>
|
||||
|
||||
<pre>namespace boost{
|
||||
|
||||
template <bool> struct STATIC_ASSERTION_FAILURE;
|
||||
|
||||
template <> struct STATIC_ASSERTION_FAILURE<true>{};
|
||||
|
||||
}</pre>
|
||||
|
||||
<p>The key feature is that the error message triggered by the
|
||||
undefined expression sizeof(STATIC_ASSERTION_FAILURE<0>),
|
||||
tends to be consistent across a wide variety of compilers. The
|
||||
rest of the machinery of BOOST_STATIC_ASSERT is just a way to
|
||||
feed the sizeof expression into a typedef. The use of a macro
|
||||
here is somewhat ugly; however boost members have spent
|
||||
considerable effort trying to invent a static assert that avoided
|
||||
macros, all to no avail. The general conclusion was that the good
|
||||
of a static assert working at namespace, function, and class
|
||||
scope outweighed the ugliness of a macro.</p>
|
||||
|
||||
<h3>Test Programs</h3>
|
||||
|
||||
<p>The following test programs are provided with this library:</p>
|
||||
|
||||
<table border="0" width="100%">
|
||||
<tr>
|
||||
<td width="33%"><i>Test Program</i></td>
|
||||
<td width="33%"><i>Expected to Compile</i></td>
|
||||
<td width="34%"><i>Description</i></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test.cpp">static_assert_test.cpp</a></td>
|
||||
<td width="33%">Yes</td>
|
||||
<td width="34%">Illustrates usage, and should always
|
||||
compile, really just tests compiler compatibility.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_example_1.cpp">static_assert_example_1.cpp</a></td>
|
||||
<td width="33%">Platform dependent.</td>
|
||||
<td width="34%">Namespace scope test program, may compile
|
||||
depending upon the platform.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_example_2.cpp">static_assert_example_2.cpp</a></td>
|
||||
<td width="33%">Yes</td>
|
||||
<td width="34%">Function scope test program.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_example_3.cpp">static_assert_example_3.cpp</a></td>
|
||||
<td width="33%">Yes</td>
|
||||
<td width="34%">Class scope test program.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_1.cpp">static_assert_test_fail_1.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at namespace scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_2.cpp">static_assert_test_fail_2.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at non-template
|
||||
function scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_3.cpp">static_assert_test_fail_3.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at non-template class
|
||||
scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_4.cpp">static_assert_test_fail_4.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at non-template class
|
||||
scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_5.cpp">static_assert_test_fail_5.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at template class
|
||||
scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_6.cpp">static_assert_test_fail_6.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure at template class
|
||||
member function scope.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="33%"><a href="static_assert_test_fail_7.cpp">static_assert_test_fail_7.cpp</a></td>
|
||||
<td width="33%">No</td>
|
||||
<td width="34%">Illustrates failure of class scope
|
||||
example.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="static_assert_test_fail_8.cpp">static_assert_test_fail_8.cpp</a></td>
|
||||
<td>No</td>
|
||||
<td>Illustrates failure of function scope example.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="static_assert_test_fail_9.cpp">static_assert_test_fail_9.cpp</a></td>
|
||||
<td>No</td>
|
||||
<td>Illustrates failure of function scope example (part 2).</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<hr>
|
||||
|
||||
<p>Revised 27th Nov 2000</p>
|
||||
|
||||
<p>Documentation <20> Copyright John Maddock 2000. Permission to
|
||||
copy, use, modify, sell and distribute this document is granted
|
||||
provided this copyright notice appears in all copies. This
|
||||
document is provided "as is" without express or implied
|
||||
warranty, and with no claim as to its suitability for any purpose.</p>
|
||||
|
||||
<p>Based on contributions by Steve Cleary and John Maddock.</p>
|
||||
|
||||
<p>Maintained by <a href="mailto:John_Maddock@compuserve.com">John
|
||||
Maddock</a>, the latest version of this file can be found at <a
|
||||
href="http://www.boost.org/">www.boost.org</a>, and the boost
|
||||
discussion list at <a
|
||||
href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>.
|
||||
</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p> </p>
|
||||
</body>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; URL=../../doc/html/boost_staticassert.html">
|
||||
</head>
|
||||
<body>
|
||||
Automatic redirection failed, please go to
|
||||
<a href="../../doc/html/boost_staticassert.html">../../doc/html/boost_staticassert.html</a>
|
||||
or view the online version at
|
||||
<a href="http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html">
|
||||
http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_staticassert.html</a>
|
||||
<P>Copyright John Maddock 2006</P>
|
||||
<P>Distributed under the Boost Software License, Version 1.0. (See accompanying file <A href="../../LICENSE_1_0.txt">
|
||||
LICENSE_1_0.txt</A> or copy at <A href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</A>).</P>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
#include <climits>
|
||||
#include <cwchar>
|
||||
#include <limits>
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
#if !defined(WCHAR_MIN)
|
||||
@ -17,7 +17,7 @@
|
||||
namespace boost{
|
||||
|
||||
namespace my_conditions {
|
||||
BOOST_STATIC_ASSERT(sizeof(int) * CHAR_BIT >= 32);
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
|
||||
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
|
||||
|
||||
} // namespace my_conditions
|
||||
@ -30,3 +30,5 @@ int main()
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -38,3 +37,4 @@ int main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -14,8 +13,8 @@ template <class UnsignedInt>
|
||||
class myclass
|
||||
{
|
||||
private:
|
||||
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
|
||||
BOOST_STATIC_ASSERT((std::numeric_limits<UnsignedInt>::digits >= 16)
|
||||
&& std::numeric_limits<UnsignedInt>::is_specialized
|
||||
&& std::numeric_limits<UnsignedInt>::is_integer
|
||||
&& !std::numeric_limits<UnsignedInt>::is_signed);
|
||||
public:
|
||||
@ -30,3 +29,5 @@ int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -84,3 +83,4 @@ int main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -11,9 +10,12 @@
|
||||
//
|
||||
// all these tests should fail:
|
||||
//
|
||||
typedef char a1[2];
|
||||
typedef char a2[3];
|
||||
|
||||
// Namespace scope
|
||||
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // will not compile
|
||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile
|
||||
|
||||
|
||||
|
||||
|
||||
|
18
static_assert_test_fail_10.cpp
Normal file
18
static_assert_test_fail_10.cpp
Normal file
@ -0,0 +1,18 @@
|
||||
//~ Copyright 2005 Redshift Software, Inc.
|
||||
//~ Distributed under the Boost Software License, Version 1.0.
|
||||
//~ (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/static_assert.hpp>
|
||||
|
||||
template <int N>
|
||||
int foo()
|
||||
{
|
||||
BOOST_STATIC_ASSERT( N < 2 );
|
||||
|
||||
return N;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
return foo<5>();
|
||||
}
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -11,13 +10,16 @@
|
||||
//
|
||||
// all these tests should fail:
|
||||
//
|
||||
typedef char a1[2];
|
||||
typedef char a2[3];
|
||||
|
||||
// Function (block) scope
|
||||
void f()
|
||||
{
|
||||
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // should not compile
|
||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // should not compile
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -11,11 +10,13 @@
|
||||
//
|
||||
// this tests should fail:
|
||||
//
|
||||
typedef char a1[2];
|
||||
typedef char a2[3];
|
||||
|
||||
struct Bob
|
||||
{
|
||||
private: // can be in private, to avoid namespace pollution
|
||||
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // will not compile
|
||||
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile
|
||||
public:
|
||||
|
||||
// Member function scope: provides access to member variables
|
||||
@ -27,7 +28,6 @@ struct Bob
|
||||
BOOST_STATIC_ASSERT(sizeof(x) == 4);
|
||||
BOOST_STATIC_ASSERT(sizeof(c) == 1);
|
||||
#endif
|
||||
//BOOST_STATIC_ASSERT((sizeof(x) == sizeof(c))); // should not compile
|
||||
return x;
|
||||
}
|
||||
};
|
||||
@ -36,3 +36,4 @@ struct Bob
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -19,11 +18,11 @@ struct Bob
|
||||
public:
|
||||
|
||||
// Member function scope: provides access to member variables
|
||||
int x;
|
||||
char x[4];
|
||||
char c;
|
||||
int f()
|
||||
{
|
||||
#ifndef BOOST_MSVC // broken sizeof in VC6
|
||||
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1200 // broken sizeof in VC6
|
||||
BOOST_STATIC_ASSERT(sizeof(x) == 4);
|
||||
BOOST_STATIC_ASSERT(sizeof(c) == 1);
|
||||
BOOST_STATIC_ASSERT((sizeof(x) == sizeof(c))); // should not compile
|
||||
@ -36,3 +35,4 @@ struct Bob
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -37,3 +36,4 @@ Bill<int, char> b;
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright Steve Cleary & John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -44,3 +43,4 @@ void foo()
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -29,3 +28,4 @@ int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -24,6 +23,12 @@ RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator)
|
||||
return from;
|
||||
}
|
||||
|
||||
// ensure that delayed instantiation compilers like Comeau see the failure early
|
||||
// enough for "compile-fail" testing with the Boost.Build testing framework. (Greg Comeau)
|
||||
template
|
||||
std::list<int>::iterator
|
||||
foo(std::list<int>::iterator, std::list<int>::iterator);
|
||||
|
||||
int main()
|
||||
{
|
||||
std::deque<int> d;
|
||||
@ -36,3 +41,4 @@ int main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
// (C) Copyright John Maddock 2000.
|
||||
// Permission to copy, use, modify, sell and
|
||||
// distribute this software is granted provided this copyright notice appears
|
||||
// in all copies. This software is provided "as is" without express or implied
|
||||
// warranty, and with no claim as to its suitability for any purpose.
|
||||
// Use, modification and distribution are subject to 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 http://www.boost.org for most recent version including documentation.
|
||||
|
||||
@ -30,3 +29,4 @@ int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user