Compare commits

...

24 Commits

Author SHA1 Message Date
d23f600412 This commit was manufactured by cvs2svn to create tag
'Version_1_32_0'.

[SVN r26264]
2004-11-19 19:19:18 +00:00
7e59c68f35 This commit was manufactured by cvs2svn to create branch 'RC_1_32_0'.
[SVN r25797]
2004-10-20 08:26:43 +00:00
811af44dd5 Added section describing problems with non-dependent static asserts in templates.
Added table of contents.


[SVN r25725]
2004-10-14 11:19:53 +00:00
2cf2951f97 c++boost.gif -> boost.png replacement
[SVN r25573]
2004-10-05 15:45:52 +00:00
f60bc26f84 Improved gcc 3.3 and 3.4 error messages.
[SVN r25413]
2004-09-26 10:24:34 +00:00
f0969644d0 Fixed doc typo.
[SVN r23427]
2004-07-10 12:36:22 +00:00
68545773d5 Changed tests to guarantee portability
[SVN r22245]
2004-02-12 11:29:47 +00:00
328b4fee16 MWCW 8.3 no longer needs the enum version. This fixes a problem in Spirit, because of two header files both having a static assert at the same line.
[SVN r21364]
2003-12-21 16:34:52 +00:00
21ab9ce12a stripped tabs
[SVN r21012]
2003-11-30 13:08:35 +00:00
0e39de168b Changed email address to john@johnmaddock.co.uk
[SVN r20472]
2003-10-24 11:13:42 +00:00
52bc1a8fb7 Added new licence info.
[SVN r20254]
2003-10-04 11:29:20 +00:00
0566bafd1d Changed licence to new Boost licnece
[SVN r20241]
2003-10-02 11:53:35 +00:00
a2c78d51be Updated licence
[SVN r20237]
2003-10-01 10:28:17 +00:00
d06c7261fc Add V2 Jamfile
[SVN r20224]
2003-09-30 08:05:42 +00:00
5e7c100b55 Use the import rule
[SVN r19968]
2003-09-08 17:38:49 +00:00
c26dde8e6e Force early instantiation so test works with delayed instantiation compilers (Greg Comeau)
[SVN r19378]
2003-07-31 00:11:24 +00:00
19e8840ad7 Added __COUNTER__ based version for VC7 and later.
[SVN r19043]
2003-07-11 11:01:55 +00:00
dd969b13ab Stop running example1 in the tests: it's intentionally non-portable.
[SVN r18823]
2003-06-17 10:50:02 +00:00
5ea5535e1a Added copyright
[SVN r18524]
2003-05-24 11:11:11 +00:00
64973e2132 add special version for SGI MIPSpro compiler
[SVN r18173]
2003-04-03 22:33:23 +00:00
02c6fb40a6 Modified Jamfile to use testing.jam
[SVN r16868]
2003-01-11 11:52:19 +00:00
5ea88d2e64 add or update See www.boost.org comments
[SVN r16708]
2002-12-27 16:51:53 +00:00
1029ee8032 Intel C++ fix
[SVN r15351]
2002-09-16 01:19:05 +00:00
f2732e699f init commit
[SVN r14977]
2002-08-19 23:29:18 +00:00
18 changed files with 361 additions and 316 deletions

31
Jamfile
View File

@ -1,16 +1,25 @@
# copyright John Maddock 2003
subproject libs/static_assert ; subproject libs/static_assert ;
# 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 ]
;
unit-test static_assert_test : static_assert_test.cpp
: <sysinclude>$(BOOST_ROOT) : ;
unit-test static_assert_example_1 : static_assert_example_1.cpp
: <sysinclude>$(BOOST_ROOT) : ;
unit-test static_assert_example_2 : static_assert_example_2.cpp
: <sysinclude>$(BOOST_ROOT) : ;
unit-test static_assert_example_3 : static_assert_example_3.cpp
: <sysinclude>$(BOOST_ROOT) : ;

24
Jamfile.v2 Normal file
View File

@ -0,0 +1,24 @@
# copyright John Maddock 2003
# 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 ]
;

View File

@ -1,10 +1,9 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org/libs/static_assert for documentation.
/* /*
Revision history: Revision history:
@ -16,6 +15,7 @@
#define BOOST_STATIC_ASSERT_HPP #define BOOST_STATIC_ASSERT_HPP
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#ifdef __BORLANDC__ #ifdef __BORLANDC__
// //
@ -23,12 +23,17 @@
#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS #define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
#endif #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
namespace boost{ namespace boost{
// HP aCC cannot deal with missing names for template value parameters // HP aCC cannot deal with missing names for template value parameters
template <bool x> struct STATIC_ASSERTION_FAILURE; 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 // HP aCC cannot deal with missing names for template value parameters
template<int x> struct static_assert_test{}; template<int x> struct static_assert_test{};
@ -57,20 +62,44 @@ template<int x> struct static_assert_test{};
// style casts: too many compilers currently have problems with static_cast // style casts: too many compilers currently have problems with static_cast
// when used inside integral constant expressions. // when used inside integral constant expressions.
// //
#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS) && !defined(__MWERKS__) #if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS) && \
#ifndef BOOST_MSVC !BOOST_WORKAROUND(__MWERKS__, < 0x3003)
#define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\ #if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
#else
// __LINE__ macro broken when -ZI is used see Q199057 // __LINE__ macro broken when -ZI is used see Q199057
// fortunately MSVC ignores duplicate typedef's. // fortunately MSVC ignores duplicate typedef's.
#define BOOST_STATIC_ASSERT( B ) \ #define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\ typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\ sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\
> boost_static_assert_typedef_ > boost_static_assert_typedef_
#elif defined(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_, __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< (bool)( 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__)
#else
// generic version
#define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
#endif #endif
#else #else
// alternative enum based implementation: // alternative enum based implementation:
#define BOOST_STATIC_ASSERT( B ) \ #define BOOST_STATIC_ASSERT( B ) \
@ -82,5 +111,3 @@ template<int x> struct static_assert_test{};
#endif // BOOST_STATIC_ASSERT_HPP #endif // BOOST_STATIC_ASSERT_HPP

9
index.html Normal file
View File

@ -0,0 +1,9 @@
<html>
<head>
<meta http-equiv="refresh" content="0; URL=static_assert.htm">
</head>
<body>
Automatic redirection failed, please go to
<a href="static_assert.htm">static_assert.htm</a>.
</body>
</html>

View File

@ -1,58 +1,48 @@
<html> <html>
<head>
<head> <title>static assertions</title>
<meta http-equiv="Content-Type" <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
content="text/html; charset=iso-8859-1"> <meta name="Template" content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
<meta name="Template" <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot"> </head>
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> <body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#800080">
<title>static assertions</title> <h1><img src="../../boost.png" width="276" height="86">Header &lt;<a href="../../boost/static_assert.hpp">boost/static_assert.hpp</a>&gt;</h1>
</head> <H3>Contents</H3>
<dl class="index">
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" <dt><a href="#overview">Overview</a> <dt><a href="#namespace">Use at namespace scope</a>
vlink="#800080"> <dt><a href="#function">Use at function scope</a> <dt><a href="#class">Use at class
scope</a> <dt><a href="#templates">Use in templates</a> <dt><a href="#how">How it
<h1><img src="../../c++boost.gif" width="276" height="86">Header works</a> <dt><a href="#test">Test programs</a></dt>
&lt;<a href="../../boost/static_assert.hpp">boost/static_assert.hpp</a>&gt;</h1> </dl>
<H3><A name="overview"></A>Overview</H3>
<p>The header &lt;boost/static_assert.hpp&gt; supplies a single <P>The header &lt;boost/static_assert.hpp&gt; supplies a single macro
macro BOOST_STATIC_ASSERT(x), which generates a compile time BOOST_STATIC_ASSERT(x), which generates a compile time error message if the <a href="../../more/int_const_guidelines.htm">
error message if the <a integral-constant-expression</a> <i>x</i> is not true. In other words it is
href="../../more/int_const_guidelines.htm">integral-constant-expression</a> the compile time equivalent of the assert macro; this is sometimes known as a
<i>x</i> is not true. In other words it is the compile time "compile-time-assertion", but will be called a "static assertion" throughout
equivalent of the assert macro; this is sometimes known as a these docs. Note that if the condition is true, then the macro will generate
&quot;compile-time-assertion&quot;, but will be called a &quot;static neither code nor data - and the macro can also be used at either namespace,
assertion&quot; throughout these docs. Note that if the condition class or function scope. When used in a template, the static assertion will be
is true, then the macro will generate neither code nor data - and evaluated at the time the template is instantiated; this is particularly useful
the macro can also be used at either namespace, class or function for validating template parameters.
scope. When used in a template, the static assertion will be </P>
evaluated at the time the template is instantiated; this is <p>One of the aims of BOOST_STATIC_ASSERT is to generate readable error messages.
particularly useful for validating template parameters. </p> 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
<p>One of the aims of BOOST_STATIC_ASSERT is to generate readable compiler, but you should see something like:
error messages. These immediately tell the user that a library is </p>
being used in a manner that is not supported. While error <pre>Illegal use of STATIC_ASSERTION_FAILURE&lt;false&gt;</pre>
messages obviously differ from compiler to compiler, but you <p>Which is intended to at least catch the eye!</p>
should see something like: </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">
<pre>Illegal use of COMPILE_TIME_ASSERTION_FAILURE&lt;false&gt;</pre> namespace</a> scope, this is illustrated by the following examples:</p>
<h3><a name="namespace"></a><A name="namespace"></A>Use at namespace scope.</h3>
<p>Which is intended to at least catch the eye!</p> <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.
<p>You can use BOOST_STATIC_ASSERT at any place where you can Suppose we require that <b>int</b> be at least a 32-bit integral type, and that <b>
place a declaration, that is at <a href="#class">class</a>, <a wchar_t</b> be an unsigned type. We can verify this at compile time as
href="#function">function</a> or <a href="#namespace">namespace</a> follows:</p>
scope, this is illustrated by the following examples:</p> <pre>#include &lt;climits&gt;
<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 &lt;climits&gt;
#include &lt;cwchar&gt; #include &lt;cwchar&gt;
#include &lt;boost/static_assert.hpp&gt; #include &lt;boost/static_assert.hpp&gt;
@ -63,40 +53,31 @@ BOOST_STATIC_ASSERT(WCHAR_MIN &gt;= 0);
} // namespace my_conditions } // namespace my_conditions
</pre> </pre>
<p>The use of the namespace <i>my_conditions</i> here requires some comment. The
<p>The use of the namespace <i>my_conditions</i> here requires macro BOOST_STATIC_ASSERT works by generating an <strong>typedef</strong> declaration,
some comment. The macro BOOST_STATIC_ASSERT works by generating and since the typedef must have a name, the macro generates one automatically
an <strong>typedef</strong> declaration, and since the typedef by mangling a stub name with the value of __LINE__. When BOOST_STATIC_ASSERT is
must have a name, the macro generates one automatically by used at either class or function scope then each use of BOOST_STATIC_ASSERT is
mangling a stub name with the value of __LINE__. When guaranteed to produce a name unique to that scope (provided you only use the
BOOST_STATIC_ASSERT is used at either class or function scope macro once on each line). However when used in a header at namespace scope,
then each use of BOOST_STATIC_ASSERT is guaranteed to produce a that namespace can be continued over multiple headers, each of which may have
name unique to that scope (provided you only use the macro once their own static assertions, and on the "same" lines, thereby generating
on each line). However when used in a header at namespace scope, duplicate declarations. In theory the compiler should silently ignore duplicate
that namespace can be continued over multiple headers, each of typedef declarations, however many do not do so (and even if they do they are
which may have their own static assertions, and on the &quot;same&quot; entitled to emit warnings in such cases). To avoid potential problems, if you
lines, thereby generating duplicate declarations. In theory the use BOOST_STATIC_ASSERT in a header and at namespace scope, then enclose them
compiler should silently ignore duplicate typedef declarations, in a namespace unique to that header.</p>
however many do not do so (and even if they do they are entitled <h3><a name="function"></a><A name="function"></A>Use at function scope</h3>
to emit warnings in such cases). To avoid potential problems, if <p>The macro is typically used at function scope inside template functions, when
you use BOOST_STATIC_ASSERT in a header and at namespace scope, the template arguments need checking. Imagine that we have an iterator-based
then enclose them in a namespace unique to that header.</p> algorithm that requires random access iterators. If the algorithm is
instantiated with iterators that do not meet our requirements then an error
<h3><a name="function"></a>Use at function scope</h3> 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
<p>The macro is typically used at function scope inside template is to add a static assertion at the top level of the template, in that case if
functions, when the template arguments need checking. Imagine the condition is not met, then an error will be generated in a way that makes
that we have an iterator-based algorithm that requires random it reasonably obvious to the user that the template is being misused.</p>
access iterators. If the algorithm is instantiated with iterators <pre>#include &lt;iterator&gt;
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 &lt;iterator&gt;
#include &lt;boost/static_assert.hpp&gt; #include &lt;boost/static_assert.hpp&gt;
#include &lt;boost/type_traits.hpp&gt; #include &lt;boost/type_traits.hpp&gt;
@ -111,24 +92,19 @@ RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator to)
// detail goes here... // detail goes here...
return from; return from;
}</pre> }</pre>
<p>A couple of footnotes are in order here: the extra set of parenthesis around
<p>A couple of footnotes are in order here: the extra set of the assert, is to prevent the comma inside the is_convertible template being
parenthesis around the assert, is to prevent the comma inside the interpreted by the preprocessor as a macro argument separator; the target type
is_convertible template being interpreted by the preprocessor as for is_convertible is a reference type, as some compilers have problems using
a macro argument separator; the target type for is_convertible is is_convertible when the conversion is via a user defined constructor (in any
a reference type, as some compilers have problems using case there is no guarantee that the iterator tag classes are
is_convertible when the conversion is via a user defined copy-constructible).</p>
constructor (in any case there is no guarantee that the iterator <h3><a name="class"></a><A name="class"></A>Use at class scope</h3>
tag classes are copy-constructible).</p> <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
<h3><a name="class"></a>Use at class scope</h3> of precision as a template argument, we can achieve this using something like
this:</p>
<p>The macro is typically used inside classes that are templates. <pre>#include &lt;climits&gt;
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 &lt;climits&gt;
#include &lt;boost/static_assert.hpp&gt; #include &lt;boost/static_assert.hpp&gt;
template &lt;class UnsignedInt&gt; template &lt;class UnsignedInt&gt;
@ -143,36 +119,41 @@ public:
/* details here */ /* details here */
}; };
</pre> </pre>
<h3><A name="templates"></A>Use in templates</h3>
<h3>How it works</h3> <P>Normally static assertions when used inside a class or function template, will
not be instantiated until the template in which it is used is
<p>BOOST_STATIC_ASSERT works as follows. There is class instantiated.&nbsp; However, there is one potential problem to watch out for:
STATIC_ASSERTION_FAILURE which is defined as:</p> if the static assertion is <EM>not</EM> dependent upon&nbsp;one or
more&nbsp;template parameters, then the compiler is permitted to evaluate the
<pre>namespace boost{ static assertion at the point it is first seen, irrespective of whether the
template is ever instantiated, for example:</P>
<PRE>template &lt;class T&gt;<BR>struct must_not_be_instantiated<BR>{<BR> BOOST_STATIC_ASSERT(false);<BR><BR><BR><BR>};</PRE>
<P>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.&nbsp; A
workaround in cases like this is to force the assertion to be dependent upon a
template parameter:</P>
<PRE>template &lt;class T&gt;<BR>struct must_not_be_instantiated<BR>{<BR> BOOST_STATIC_ASSERT(sizeof(T) == 0); // will be triggered if this type is instantiated<BR><BR><BR><BR>};</PRE>
<H3><A name="how"></A>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 &lt;bool&gt; struct STATIC_ASSERTION_FAILURE; template &lt;bool&gt; struct STATIC_ASSERTION_FAILURE;
template &lt;&gt; struct STATIC_ASSERTION_FAILURE&lt;true&gt;{}; template &lt;&gt; struct STATIC_ASSERTION_FAILURE&lt;true&gt;{};
}</pre> }</pre>
<p>The key feature is that the error message triggered by the undefined expression
<p>The key feature is that the error message triggered by the sizeof(STATIC_ASSERTION_FAILURE&lt;0&gt;), tends to be consistent across a wide
undefined expression sizeof(STATIC_ASSERTION_FAILURE&lt;0&gt;), variety of compilers. The rest of the machinery of BOOST_STATIC_ASSERT is just
tends to be consistent across a wide variety of compilers. The a way to feed the sizeof expression into a typedef. The use of a macro here is
rest of the machinery of BOOST_STATIC_ASSERT is just a way to somewhat ugly; however boost members have spent considerable effort trying to
feed the sizeof expression into a typedef. The use of a macro invent a static assert that avoided macros, all to no avail. The general
here is somewhat ugly; however boost members have spent conclusion was that the good of a static assert working at namespace, function,
considerable effort trying to invent a static assert that avoided and class scope outweighed the ugliness of a macro.</p>
macros, all to no avail. The general conclusion was that the good <h3><A name="test"></A>Test Programs</h3>
of a static assert working at namespace, function, and class <p>The following test programs are provided with this library:</p>
scope outweighed the ugliness of a macro.</p> <table border="0" width="100%">
<h3>Test Programs</h3>
<p>The following test programs are provided with this library:</p>
<table border="0" width="100%">
<tr> <tr>
<td width="33%"><i>Test Program</i></td> <td width="33%"><i>Test Program</i></td>
<td width="33%"><i>Expected to Compile</i></td> <td width="33%"><i>Expected to Compile</i></td>
@ -181,14 +162,14 @@ scope outweighed the ugliness of a macro.</p>
<tr> <tr>
<td width="33%"><a href="static_assert_test.cpp">static_assert_test.cpp</a></td> <td width="33%"><a href="static_assert_test.cpp">static_assert_test.cpp</a></td>
<td width="33%">Yes</td> <td width="33%">Yes</td>
<td width="34%">Illustrates usage, and should always <td width="34%">Illustrates usage, and should always compile, really just tests
compile, really just tests compiler compatibility.</td> compiler compatibility.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_example_1.cpp">static_assert_example_1.cpp</a></td> <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="33%">Platform dependent.</td>
<td width="34%">Namespace scope test program, may compile <td width="34%">Namespace scope test program, may compile depending upon the
depending upon the platform.</td> platform.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_example_2.cpp">static_assert_example_2.cpp</a></td> <td width="33%"><a href="static_assert_example_2.cpp">static_assert_example_2.cpp</a></td>
@ -208,38 +189,32 @@ scope outweighed the ugliness of a macro.</p>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_2.cpp">static_assert_test_fail_2.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure at non-template <td width="34%">Illustrates failure at non-template function scope.</td>
function scope.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_3.cpp">static_assert_test_fail_3.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure at non-template class <td width="34%">Illustrates failure at non-template class scope.</td>
scope.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_4.cpp">static_assert_test_fail_4.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure at non-template class <td width="34%">Illustrates failure at non-template class scope.</td>
scope.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_5.cpp">static_assert_test_fail_5.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure at template class <td width="34%">Illustrates failure at template class scope.</td>
scope.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_6.cpp">static_assert_test_fail_6.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure at template class <td width="34%">Illustrates failure at template class member function scope.</td>
member function scope.</td>
</tr> </tr>
<tr> <tr>
<td width="33%"><a href="static_assert_test_fail_7.cpp">static_assert_test_fail_7.cpp</a></td> <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="33%">No</td>
<td width="34%">Illustrates failure of class scope <td width="34%">Illustrates failure of class scope example.</td>
example.</td>
</tr> </tr>
<tr> <tr>
<td><a href="static_assert_test_fail_8.cpp">static_assert_test_fail_8.cpp</a></td> <td><a href="static_assert_test_fail_8.cpp">static_assert_test_fail_8.cpp</a></td>
@ -251,29 +226,19 @@ scope outweighed the ugliness of a macro.</p>
<td>No</td> <td>No</td>
<td>Illustrates failure of function scope example (part 2).</td> <td>Illustrates failure of function scope example (part 2).</td>
</tr> </tr>
</table> </table>
<hr>
<hr> <p>Revised 27th Nov 2000</p>
<p>Documentation <20> Copyright John Maddock 2000. Permission to copy, use, modify,
<p>Revised 27th Nov 2000</p> sell and distribute this document is granted provided this copyright notice
appears in all copies. This document is provided "as is" without express or
<p>Documentation <20> Copyright John Maddock 2000. Permission to implied warranty, and with no claim as to its suitability for any purpose.</p>
copy, use, modify, sell and distribute this document is granted <p>Based on contributions by Steve Cleary and John Maddock.</p>
provided this copyright notice appears in all copies. This <p>Maintained by <a href="mailto:john@johnmaddock.co.uk">John Maddock</a>, the
document is provided &quot;as is&quot; without express or implied latest version of this file can be found at <a href="http://www.boost.org/">www.boost.org</a>,
warranty, and with no claim as to its suitability for any purpose.</p> and the boost discussion list at <a href="http://www.yahoogroups.com/list/boost">www.yahoogroups.com/list/boost</a>.
</p>
<p>Based on contributions by Steve Cleary and John Maddock.</p> <p>&nbsp;</p>
<p>&nbsp;</p>
<p>Maintained by <a href="mailto:John_Maddock@compuserve.com">John </body>
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>&nbsp;</p>
<p>&nbsp;</p>
</body>
</html> </html>

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -30,3 +29,4 @@ int main()
} }

View File

@ -1,8 +1,7 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -38,3 +37,4 @@ int main()

View File

@ -1,8 +1,7 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -30,3 +29,4 @@ int main()
{ {
return 0; return 0;
} }

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -84,3 +83,4 @@ int main()

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -11,9 +10,12 @@
// //
// all these tests should fail: // all these tests should fail:
// //
typedef char a1[2];
typedef char a2[3];
// Namespace scope // Namespace scope
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // will not compile BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -11,13 +10,16 @@
// //
// all these tests should fail: // all these tests should fail:
// //
typedef char a1[2];
typedef char a2[3];
// Function (block) scope // Function (block) scope
void f() void f()
{ {
BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // should not compile BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // should not compile
} }

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -11,11 +10,13 @@
// //
// this tests should fail: // this tests should fail:
// //
typedef char a1[2];
typedef char a2[3];
struct Bob struct Bob
{ {
private: // can be in private, to avoid namespace pollution 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: public:
// Member function scope: provides access to member variables // Member function scope: provides access to member variables
@ -27,7 +28,6 @@ struct Bob
BOOST_STATIC_ASSERT(sizeof(x) == 4); BOOST_STATIC_ASSERT(sizeof(x) == 4);
BOOST_STATIC_ASSERT(sizeof(c) == 1); BOOST_STATIC_ASSERT(sizeof(c) == 1);
#endif #endif
//BOOST_STATIC_ASSERT((sizeof(x) == sizeof(c))); // should not compile
return x; return x;
} }
}; };
@ -36,3 +36,4 @@ struct Bob

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -19,7 +18,7 @@ struct Bob
public: public:
// Member function scope: provides access to member variables // Member function scope: provides access to member variables
int x; char x[4];
char c; char c;
int f() int f()
{ {
@ -36,3 +35,4 @@ struct Bob

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -37,3 +36,4 @@ Bill<int, char> b;

View File

@ -1,8 +1,7 @@
// (C) Copyright Steve Cleary & John Maddock 2000. // (C) Copyright Steve Cleary & John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -44,3 +43,4 @@ void foo()

View File

@ -1,8 +1,7 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -29,3 +28,4 @@ int main()
{ {
return 0; return 0;
} }

View File

@ -1,8 +1,7 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -24,6 +23,12 @@ RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator)
return from; 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() int main()
{ {
std::deque<int> d; std::deque<int> d;
@ -36,3 +41,4 @@ int main()

View File

@ -1,8 +1,7 @@
// (C) Copyright John Maddock 2000. // (C) Copyright John Maddock 2000.
// Permission to copy, use, modify, sell and // Use, modification and distribution are subject to the
// distribute this software is granted provided this copyright notice appears // Boost Software License, Version 1.0. (See accompanying file
// in all copies. This software is provided "as is" without express or implied // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation. // See http://www.boost.org for most recent version including documentation.
@ -30,3 +29,4 @@ int main()
{ {
return 0; return 0;
} }