From 8cb6da5df005a4511ae215a1d85b72ce8d680bec Mon Sep 17 00:00:00 2001 From: John Maddock Date: Sun, 3 Dec 2000 12:29:42 +0000 Subject: [PATCH] Static assert initial checkin [SVN r8381] --- .gitattributes | 96 ++++++++++++ include/boost/static_assert.hpp | 89 +++++++++++ static_assert.htm | 252 ++++++++++++++++++++++++++++++++ static_assert_example_1.cpp | 31 ++++ static_assert_example_2.cpp | 40 +++++ static_assert_example_3.cpp | 32 ++++ static_assert_test.cpp | 88 +++++++++++ static_assert_test_fail_1.cpp | 21 +++ static_assert_test_fail_2.cpp | 23 +++ static_assert_test_fail_3.cpp | 38 +++++ static_assert_test_fail_4.cpp | 42 ++++++ static_assert_test_fail_5.cpp | 39 +++++ static_assert_test_fail_6.cpp | 46 ++++++ static_assert_test_fail_7.cpp | 31 ++++ static_assert_test_fail_8.cpp | 37 +++++ static_assert_test_fail_9.cpp | 32 ++++ 16 files changed, 937 insertions(+) create mode 100644 .gitattributes create mode 100644 include/boost/static_assert.hpp create mode 100644 static_assert.htm create mode 100644 static_assert_example_1.cpp create mode 100644 static_assert_example_2.cpp create mode 100644 static_assert_example_3.cpp create mode 100644 static_assert_test.cpp create mode 100644 static_assert_test_fail_1.cpp create mode 100644 static_assert_test_fail_2.cpp create mode 100644 static_assert_test_fail_3.cpp create mode 100644 static_assert_test_fail_4.cpp create mode 100644 static_assert_test_fail_5.cpp create mode 100644 static_assert_test_fail_6.cpp create mode 100644 static_assert_test_fail_7.cpp create mode 100644 static_assert_test_fail_8.cpp create mode 100644 static_assert_test_fail_9.cpp 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..9e502ad --- /dev/null +++ b/include/boost/static_assert.hpp @@ -0,0 +1,89 @@ +// (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{ + +template struct STATIC_ASSERTION_FAILURE; + +template <> struct STATIC_ASSERTION_FAILURE{}; + +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... +// +#ifndef BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS +#ifndef BOOST_MSVC +#define BOOST_STATIC_ASSERT( B ) \ + typedef ::boost::static_assert_test<\ + sizeof(::boost::STATIC_ASSERTION_FAILURE< ( 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< ( 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< ( 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 expantion 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..164a4b3 --- /dev/null +++ b/static_assert.htm @@ -0,0 +1,252 @@ + + + + + + + + +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.egroups.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..981b90e --- /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..1e70285 --- /dev/null +++ b/static_assert_test.cpp @@ -0,0 +1,88 @@ +// (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..e768d86 --- /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..68553ae --- /dev/null +++ b/static_assert_test_fail_8.cpp @@ -0,0 +1,37 @@ +// (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..001d623 --- /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; +}