commit 0aa486119c71e3d31f204a363b04a86b35ca67c2 Author: nobody Date: Mon May 28 15:01:00 2001 +0000 This commit was manufactured by cvs2svn to create tag 'Version_1_22_0'. [SVN r10239] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3e84d7c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,96 @@ +* text=auto !eol svneol=native#text/plain +*.gitattributes text svneol=native#text/plain + +# Scriptish formats +*.bat text svneol=native#text/plain +*.bsh text svneol=native#text/x-beanshell +*.cgi text svneol=native#text/plain +*.cmd text svneol=native#text/plain +*.js text svneol=native#text/javascript +*.php text svneol=native#text/x-php +*.pl text svneol=native#text/x-perl +*.pm text svneol=native#text/x-perl +*.py text svneol=native#text/x-python +*.sh eol=lf svneol=LF#text/x-sh +configure eol=lf svneol=LF#text/x-sh + +# Image formats +*.bmp binary svneol=unset#image/bmp +*.gif binary svneol=unset#image/gif +*.ico binary svneol=unset#image/ico +*.jpeg binary svneol=unset#image/jpeg +*.jpg binary svneol=unset#image/jpeg +*.png binary svneol=unset#image/png +*.tif binary svneol=unset#image/tiff +*.tiff binary svneol=unset#image/tiff +*.svg text svneol=native#image/svg%2Bxml + +# Data formats +*.pdf binary svneol=unset#application/pdf +*.avi binary svneol=unset#video/avi +*.doc binary svneol=unset#application/msword +*.dsp text svneol=crlf#text/plain +*.dsw text svneol=crlf#text/plain +*.eps binary svneol=unset#application/postscript +*.gz binary svneol=unset#application/gzip +*.mov binary svneol=unset#video/quicktime +*.mp3 binary svneol=unset#audio/mpeg +*.ppt binary svneol=unset#application/vnd.ms-powerpoint +*.ps binary svneol=unset#application/postscript +*.psd binary svneol=unset#application/photoshop +*.rdf binary svneol=unset#text/rdf +*.rss text svneol=unset#text/xml +*.rtf binary svneol=unset#text/rtf +*.sln text svneol=native#text/plain +*.swf binary svneol=unset#application/x-shockwave-flash +*.tgz binary svneol=unset#application/gzip +*.vcproj text svneol=native#text/xml +*.vcxproj text svneol=native#text/xml +*.vsprops text svneol=native#text/xml +*.wav binary svneol=unset#audio/wav +*.xls binary svneol=unset#application/vnd.ms-excel +*.zip binary svneol=unset#application/zip + +# Text formats +.htaccess text svneol=native#text/plain +*.bbk text svneol=native#text/xml +*.cmake text svneol=native#text/plain +*.css text svneol=native#text/css +*.dtd text svneol=native#text/xml +*.htm text svneol=native#text/html +*.html text svneol=native#text/html +*.ini text svneol=native#text/plain +*.log text svneol=native#text/plain +*.mak text svneol=native#text/plain +*.qbk text svneol=native#text/plain +*.rst text svneol=native#text/plain +*.sql text svneol=native#text/x-sql +*.txt text svneol=native#text/plain +*.xhtml text svneol=native#text/xhtml%2Bxml +*.xml text svneol=native#text/xml +*.xsd text svneol=native#text/xml +*.xsl text svneol=native#text/xml +*.xslt text svneol=native#text/xml +*.xul text svneol=native#text/xul +*.yml text svneol=native#text/plain +boost-no-inspect text svneol=native#text/plain +CHANGES text svneol=native#text/plain +COPYING text svneol=native#text/plain +INSTALL text svneol=native#text/plain +Jamfile text svneol=native#text/plain +Jamroot text svneol=native#text/plain +Jamfile.v2 text svneol=native#text/plain +Jamrules text svneol=native#text/plain +Makefile* text svneol=native#text/plain +README text svneol=native#text/plain +TODO text svneol=native#text/plain + +# Code formats +*.c text svneol=native#text/plain +*.cpp text svneol=native#text/plain +*.h text svneol=native#text/plain +*.hpp text svneol=native#text/plain +*.ipp text svneol=native#text/plain +*.tpp text svneol=native#text/plain +*.jam text svneol=native#text/plain +*.java text svneol=native#text/plain diff --git a/include/boost/static_assert.hpp b/include/boost/static_assert.hpp new file mode 100644 index 0000000..af42173 --- /dev/null +++ b/include/boost/static_assert.hpp @@ -0,0 +1,92 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +/* + Revision history: + 02 August 2000 + Initial version. +*/ + +#ifndef BOOST_STATIC_ASSERT_HPP +#define BOOST_STATIC_ASSERT_HPP + +#include + +#ifdef __BORLANDC__ +// +// workaround for buggy integral-constant expression support: +#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS +#endif + +namespace boost{ + +// HP aCC cannot deal with missing names for template value parameters +template struct STATIC_ASSERTION_FAILURE; + +template <> struct STATIC_ASSERTION_FAILURE{}; + +// HP aCC cannot deal with missing names for template value parameters +template struct static_assert_test{}; + +} + +// +// Implicit instantiation requires that all member declarations be +// instantiated, but that the definitions are *not* instantiated. +// +// It's not particularly clear how this applies to enum's or typedefs; +// both are described as declarations [7.1.3] and [7.2] in the standard, +// however some compilers use "delayed evaluation" of one or more of +// these when implicitly instantiating templates. We use typedef declarations +// by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum +// version gets better results from your compiler... +// +// Implementation: +// Both of these versions rely on sizeof(incomplete_type) generating an error +// message containing the name of the incomplete type. We use +// "STATIC_ASSERTION_FAILURE" as the type name here to generate +// an eye catching error message. The result of the sizeof expression is either +// used as an enum initialiser, or as a template argument depending which version +// is in use... +// +#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_ASSERT_JOIN(boost_static_assert_typedef_, __LINE__) +#else +// __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_ +#endif +#else +// alternative enum based implementation: +#define BOOST_STATIC_ASSERT( B ) \ + enum { BOOST_ASSERT_JOIN(boost_static_assert_enum_, __LINE__) \ + = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) } +#endif + +// +// The following piece of macro magic joins the two +// arguments together, even when one of the arguments is +// itself a macro (see 16.3.1 in C++ standard). The key +// is that macro expansion of macro arguments does not +// occur in BOOST_DO_ASSERT_JOIN but does in BOOST_ASSERT_JOIN +// provided it is called from within another macro. +#define BOOST_ASSERT_JOIN( X, Y ) BOOST_DO_ASSERT_JOIN( X, Y ) +#define BOOST_DO_ASSERT_JOIN( X, Y ) X##Y + +#endif // BOOST_STATIC_ASSERT_HPP + + + + diff --git a/static_assert.htm b/static_assert.htm new file mode 100644 index 0000000..92f475e --- /dev/null +++ b/static_assert.htm @@ -0,0 +1,279 @@ + + + + + + +static assertions + + + + +

Header +<boost/static_assert.hpp>

+ +

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 COMPILE_TIME_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:

+ +

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 <boost/static_assert.hpp>
+
+namespace my_conditions {
+
+BOOST_STATIC_ASSERT(sizeof(int) * CHAR_BIT >= 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.

+ +

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).

+ +

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>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 */
+};
+
+ +

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.

+ +

Test Programs

+ +

The following test programs are provided with this library:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test ProgramExpected to CompileDescription
static_assert_test.cppYesIllustrates usage, and should always + compile, really just tests compiler compatibility.
static_assert_example_1.cppPlatform dependent.Namespace scope test program, may compile + depending upon the platform.
static_assert_example_2.cppYesFunction scope test program.
static_assert_example_3.cppYesClass scope test program.
static_assert_test_fail_1.cppNoIllustrates failure at namespace scope.
static_assert_test_fail_2.cppNoIllustrates failure at non-template + function scope.
static_assert_test_fail_3.cppNoIllustrates failure at non-template class + scope.
static_assert_test_fail_4.cppNoIllustrates failure at non-template class + scope.
static_assert_test_fail_5.cppNoIllustrates failure at template class + scope.
static_assert_test_fail_6.cppNoIllustrates failure at template class + member function scope.
static_assert_test_fail_7.cppNoIllustrates failure of class scope + example.
static_assert_test_fail_8.cppNoIllustrates failure of function scope example.
static_assert_test_fail_9.cppNoIllustrates failure of function scope example (part 2).
+ +
+ +

Revised 27th Nov 2000

+ +

Documentation © 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.

+ +

Based on contributions by Steve Cleary and John Maddock.

+ +

Maintained by John +Maddock, the latest version of this file can be found at www.boost.org, and the boost +discussion list at www.yahoogroups.com/list/boost. +

+ +

 

+ +

 

+ + diff --git a/static_assert_example_1.cpp b/static_assert_example_1.cpp new file mode 100644 index 0000000..e5ac489 --- /dev/null +++ b/static_assert_example_1.cpp @@ -0,0 +1,31 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include + +#if defined(__BORLANDC__) && !defined(WCHAR_MIN) +#define WCHAR_MIN 0 +#endif + +namespace boost{ + +namespace my_conditions { +BOOST_STATIC_ASSERT(sizeof(int) * CHAR_BIT >= 32); +BOOST_STATIC_ASSERT(WCHAR_MIN >= 0); + +} // namespace my_conditions + +} // namespace boost + +int main() +{ + return 0; +} + diff --git a/static_assert_example_2.cpp b/static_assert_example_2.cpp new file mode 100644 index 0000000..9be3336 --- /dev/null +++ b/static_assert_example_2.cpp @@ -0,0 +1,40 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include +#include +#include + +template +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::value)); + // + // detail goes here... + return from; +} + +int main() +{ + std::deque d; + std::list l; + foo(d.begin(), d.end()); // OK + //foo(l.begin(), l.end()); // error + return 0; +} + + + + + + diff --git a/static_assert_example_3.cpp b/static_assert_example_3.cpp new file mode 100644 index 0000000..842e39c --- /dev/null +++ b/static_assert_example_3.cpp @@ -0,0 +1,32 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include + +template +class myclass +{ +private: + BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16); + BOOST_STATIC_ASSERT(std::numeric_limits::is_specialized + && std::numeric_limits::is_integer + && !std::numeric_limits::is_signed); +public: + /* details here */ +}; + +myclass m1; // this should be OK +//myclass m2; // this should fail +//myclass m3; // and so should this + +int main() +{ + return 0; +} diff --git a/static_assert_test.cpp b/static_assert_test.cpp new file mode 100644 index 0000000..065bf7b --- /dev/null +++ b/static_assert_test.cpp @@ -0,0 +1,86 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// all these tests should succeed. +// some of these tests are rather simplistic (ie useless) +// in order to ensure that they compile on all platforms. +// + +// Namespace scope +BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); +BOOST_STATIC_ASSERT(sizeof(char) == 1); + +// Function (block) scope +void f() +{ + BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); + BOOST_STATIC_ASSERT(sizeof(char) == 1); +} + +struct Bob +{ + private: // can be in private, to avoid namespace pollution + BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); + BOOST_STATIC_ASSERT(sizeof(char) == 1); + public: + + // Member function scope: provides access to member variables + int x; + char c; + int f() + { +#ifndef _MSC_VER // broken sizeof in VC6 + BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short)); + BOOST_STATIC_ASSERT(sizeof(c) == 1); +#endif + return x; + } +}; + + + +// Template class scope +template +struct Bill +{ + private: // can be in private, to avoid namespace pollution + BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char)); + public: + + // Template member function scope: provides access to member variables + Int x; + Char c; + template + void f(Int2 , Char2 ) + { + BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2)); + BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2)); + } +}; + +void test_Bill() // BOOST_CT_ASSERTs are not triggerred until instantiated +{ + Bill z; + //Bill bad; // will not compile + int i = 3; + char ch = 'a'; + z.f(i, ch); + //z.f(i, i); // should not compile +} + +int main() +{ + test_Bill(); + return 0; +} + + + diff --git a/static_assert_test_fail_1.cpp b/static_assert_test_fail_1.cpp new file mode 100644 index 0000000..a80fdfe --- /dev/null +++ b/static_assert_test_fail_1.cpp @@ -0,0 +1,21 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// all these tests should fail: +// + +// Namespace scope +BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // will not compile + + + + + diff --git a/static_assert_test_fail_2.cpp b/static_assert_test_fail_2.cpp new file mode 100644 index 0000000..45d292d --- /dev/null +++ b/static_assert_test_fail_2.cpp @@ -0,0 +1,23 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// all these tests should fail: +// + +// Function (block) scope +void f() +{ + BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // should not compile +} + + + + diff --git a/static_assert_test_fail_3.cpp b/static_assert_test_fail_3.cpp new file mode 100644 index 0000000..4031e27 --- /dev/null +++ b/static_assert_test_fail_3.cpp @@ -0,0 +1,38 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// this tests should fail: +// + +struct Bob +{ + private: // can be in private, to avoid namespace pollution + BOOST_STATIC_ASSERT(sizeof(int) == sizeof(char)); // will not compile + public: + + // Member function scope: provides access to member variables + int x; + char c; + int f() + { +#ifndef _MSC_VER // broken sizeof in VC6 + 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; + } +}; + + + + + diff --git a/static_assert_test_fail_4.cpp b/static_assert_test_fail_4.cpp new file mode 100644 index 0000000..019fcbe --- /dev/null +++ b/static_assert_test_fail_4.cpp @@ -0,0 +1,42 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include + +// +// all these tests should fail: +// + +#ifdef BOOST_MSVC +#error "VC6 not supported in this test (buggy compiler problem)" +#endif + + +struct Bob +{ + public: + + // Member function scope: provides access to member variables + int x; + char c; + int f() + { +#ifndef _MSC_VER // 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 +#endif + return x; + } +}; + + + + + diff --git a/static_assert_test_fail_5.cpp b/static_assert_test_fail_5.cpp new file mode 100644 index 0000000..afef667 --- /dev/null +++ b/static_assert_test_fail_5.cpp @@ -0,0 +1,39 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// all these tests should fail: +// + +// Template class scope +template +struct Bill +{ + private: // can be in private, to avoid namespace pollution + BOOST_STATIC_ASSERT(sizeof(Int) == 4); + BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated + public: + + // Template member function scope: provides access to member variables + Int x; + Char c; + template + void f(Int2 , Char2 ) + { + BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2)); + BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2)); + //BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated + } +}; + +Bill b; + + + diff --git a/static_assert_test_fail_6.cpp b/static_assert_test_fail_6.cpp new file mode 100644 index 0000000..31a34bc --- /dev/null +++ b/static_assert_test_fail_6.cpp @@ -0,0 +1,46 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include + +// +// all these tests should fail: +// + +// Template class scope +template +struct Bill +{ + private: // can be in private, to avoid namespace pollution + BOOST_STATIC_ASSERT(sizeof(Int) == 4); + //BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated + public: + + // Template member function scope: provides access to member variables + Int x; + Char c; + template + void f(Int2 , Char2 ) + { + BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2)); + BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2)); + BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated + } +}; + +void foo() +{ + int i = 0; + char c = 0; + Bill b; + // this should fail: + b.f(i, c); +} + + + diff --git a/static_assert_test_fail_7.cpp b/static_assert_test_fail_7.cpp new file mode 100644 index 0000000..5f8ba3e --- /dev/null +++ b/static_assert_test_fail_7.cpp @@ -0,0 +1,31 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include + +template +class myclass +{ +private: + BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16); + BOOST_STATIC_ASSERT(std::numeric_limits::is_specialized + && std::numeric_limits::is_integer + && !std::numeric_limits::is_signed); +public: + /* details here */ +}; + +myclass m2; // this should fail +myclass m3; // and so should this + +int main() +{ + return 0; +} diff --git a/static_assert_test_fail_8.cpp b/static_assert_test_fail_8.cpp new file mode 100644 index 0000000..81176e6 --- /dev/null +++ b/static_assert_test_fail_8.cpp @@ -0,0 +1,38 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include +#include +#include + +template +RandonAccessIterator foo(RandonAccessIterator from, RandonAccessIterator to) +{ + // this template can only be used with + // random access iterators... + typedef typename std::iterator_traits< RandonAccessIterator >::iterator_category cat; + BOOST_STATIC_ASSERT((boost::is_convertible::value)); + // + // detail goes here... + return from; +} + +int main() +{ + std::deque d; + std::list l; + foo(d.begin(), d.end()); // OK + foo(l.begin(), l.end()); // error + return 0; +} + + + + diff --git a/static_assert_test_fail_9.cpp b/static_assert_test_fail_9.cpp new file mode 100644 index 0000000..041e70d --- /dev/null +++ b/static_assert_test_fail_9.cpp @@ -0,0 +1,32 @@ +// (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. + +// See http://www.boost.org for most recent version including documentation. + +#include +#include +#include + +template +class myclass +{ +private: + BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16); + BOOST_STATIC_ASSERT(std::numeric_limits::is_specialized + && std::numeric_limits::is_integer + && !std::numeric_limits::is_signed); +public: + /* details here */ +}; + +myclass m1; // this should be OK +//myclass m2; // this should fail +myclass m3; // and so should this + +int main() +{ + return 0; +}