github.com/searKing/golang/go@v1.2.117/runtime/cgosymbolizer/include/boost/static_assert.hpp (about)

     1  //  (C) Copyright John Maddock 2000.
     2  //  Use, modification and distribution are subject to the 
     3  //  Boost Software License, Version 1.0. (See accompanying file 
     4  //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
     5  
     6  //  See http://www.boost.org/libs/static_assert for documentation.
     7  
     8  /*
     9   Revision history:
    10     02 August 2000
    11        Initial version.
    12  */
    13  
    14  #ifndef BOOST_STATIC_ASSERT_HPP
    15  #define BOOST_STATIC_ASSERT_HPP
    16  
    17  #include <boost/config.hpp>
    18  #include <boost/detail/workaround.hpp>
    19  
    20  #if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
    21  //
    22  // This is horrible, but it seems to be the only we can shut up the
    23  // "anonymous variadic macros were introduced in C99 [-Wvariadic-macros]"
    24  // warning that get spewed out otherwise in non-C++11 mode.
    25  //
    26  #pragma GCC system_header
    27  #endif
    28  
    29  #ifndef BOOST_NO_CXX11_STATIC_ASSERT
    30  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
    31  #     define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
    32  #  else
    33  #     define BOOST_STATIC_ASSERT_MSG( B, Msg ) static_assert( B, Msg )
    34  #  endif
    35  #else
    36  #     define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
    37  #endif
    38  
    39  #ifdef BOOST_BORLANDC
    40  //
    41  // workaround for buggy integral-constant expression support:
    42  #define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
    43  #endif
    44  
    45  #if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))
    46  // gcc 3.3 and 3.4 don't produce good error messages with the default version:
    47  #  define BOOST_SA_GCC_WORKAROUND
    48  #endif
    49  
    50  //
    51  // If the compiler issues warnings about old C style casts,
    52  // then enable this:
    53  //
    54  #if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))
    55  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
    56  #     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) ((__VA_ARGS__) != 0)
    57  #  else
    58  #     define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) != 0)
    59  #  endif
    60  #else
    61  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
    62  #     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) (bool)(__VA_ARGS__)
    63  #  else
    64  #     define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
    65  #  endif
    66  #endif
    67  
    68  #ifndef BOOST_NO_CXX11_STATIC_ASSERT
    69  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
    70  #     define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
    71  #  else
    72  #     define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
    73  #  endif
    74  #else
    75  
    76  namespace boost{
    77  
    78  // HP aCC cannot deal with missing names for template value parameters
    79  template <bool x> struct STATIC_ASSERTION_FAILURE;
    80  
    81  template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
    82  
    83  // HP aCC cannot deal with missing names for template value parameters
    84  template<int x> struct static_assert_test{};
    85  
    86  }
    87  
    88  //
    89  // Implicit instantiation requires that all member declarations be
    90  // instantiated, but that the definitions are *not* instantiated.
    91  //
    92  // It's not particularly clear how this applies to enum's or typedefs;
    93  // both are described as declarations [7.1.3] and [7.2] in the standard,
    94  // however some compilers use "delayed evaluation" of one or more of
    95  // these when implicitly instantiating templates.  We use typedef declarations
    96  // by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum
    97  // version gets better results from your compiler...
    98  //
    99  // Implementation:
   100  // Both of these versions rely on sizeof(incomplete_type) generating an error
   101  // message containing the name of the incomplete type.  We use
   102  // "STATIC_ASSERTION_FAILURE" as the type name here to generate
   103  // an eye catching error message.  The result of the sizeof expression is either
   104  // used as an enum initialiser, or as a template argument depending which version
   105  // is in use...
   106  // Note that the argument to the assert is explicitly cast to bool using old-
   107  // style casts: too many compilers currently have problems with static_cast
   108  // when used inside integral constant expressions.
   109  //
   110  #if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
   111  
   112  #if defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
   113  #define BOOST_STATIC_ASSERT( B ) \
   114     typedef ::boost::static_assert_test<\
   115        sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
   116           BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
   117  #elif defined(BOOST_MSVC)
   118  #define BOOST_STATIC_ASSERT(...) \
   119     typedef ::boost::static_assert_test<\
   120        sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST (__VA_ARGS__) >)>\
   121           BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
   122  #elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
   123  // agurt 15/sep/02: a special care is needed to force Intel C++ issue an error 
   124  // instead of warning in case of failure
   125  # define BOOST_STATIC_ASSERT( B ) \
   126      typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
   127          [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]
   128  #elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && !defined(BOOST_NO_CXX11_VARIADIC_MACROS)
   129  // agurt 15/sep/02: a special care is needed to force Intel C++ issue an error 
   130  // instead of warning in case of failure
   131  # define BOOST_STATIC_ASSERT(...) \
   132      typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
   133          [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >::value ]
   134  #elif defined(__sgi)
   135  // special version for SGI MIPSpro compiler
   136  #define BOOST_STATIC_ASSERT( B ) \
   137     BOOST_STATIC_CONSTANT(bool, \
   138       BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \
   139     typedef ::boost::static_assert_test<\
   140       sizeof(::boost::STATIC_ASSERTION_FAILURE< \
   141         BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\
   142           BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
   143  #elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
   144  // special version for CodeWarrior <= 8.x
   145  #define BOOST_STATIC_ASSERT( B ) \
   146     BOOST_STATIC_CONSTANT(int, \
   147       BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
   148         sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )
   149  #else
   150  // generic version
   151  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
   152  #     define BOOST_STATIC_ASSERT( ... ) \
   153           typedef ::boost::static_assert_test<\
   154              sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >)>\
   155                 BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
   156  #  else
   157  #     define BOOST_STATIC_ASSERT( B ) \
   158           typedef ::boost::static_assert_test<\
   159              sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
   160                 BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
   161  #  endif
   162  #endif
   163  
   164  #else
   165  // alternative enum based implementation:
   166  #  ifndef BOOST_NO_CXX11_VARIADIC_MACROS
   167  #    define BOOST_STATIC_ASSERT( ... ) \
   168           enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
   169              = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( __VA_ARGS__ ) >) }
   170  #  else
   171  #    define BOOST_STATIC_ASSERT(B) \
   172           enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
   173              = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
   174  #  endif
   175  #endif
   176  #endif // defined(BOOST_NO_CXX11_STATIC_ASSERT)
   177  
   178  #endif // BOOST_STATIC_ASSERT_HPP
   179  
   180