diff --git a/src/compat/assumptions.h b/src/compat/assumptions.h --- a/src/compat/assumptions.h +++ b/src/compat/assumptions.h @@ -20,6 +20,18 @@ #error "Bitcoin cannot be compiled without assertions." #endif +// Assumption: We assume a C++14 (ISO/IEC 14882:2014) compiler (minimum +// requirement). +// Example(s): We use std::make_unique() through the codebase. +// Note: MSVC does not report the expected __cplusplus value due to +// legacy reasons. +#if !defined(_MSC_VER) +// N3936* ยง16.8 [cpp.predefined]/p1:: +// "The name __cplusplus is defined to the value 201402L when compiling a C++ +// translation unit." +static_assert(__cplusplus >= 201402L, "C++14 standard assumed"); +#endif + // Assumption: We assume the floating-point types to fulfill the requirements of // IEC 559 (IEEE 754) standard. // Example(s): Floating-point division by zero in ConnectBlock, @@ -57,8 +69,16 @@ static_assert(std::is_same::value, "uint8_t is an alias of unsigned char"); +// Assumption: We assume size_t to be 32-bit or 64-bit. +// Example(s): size_t assumed to be at least 32-bit in +// ecdsa_signature_parse_der_lax(...). +// size_t assumed to be 32-bit or 64-bit in MallocUsage(...). +static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, + "size_t assumed to be 32-bit or 64-bit"); +static_assert(sizeof(size_t) == sizeof(void *), + "Sizes of size_t and void* assumed to be equal"); + // Some important things we are NOT assuming (non-exhaustive list): -// * We are NOT assuming a specific value for sizeof(std::size_t). // * We are NOT assuming a specific value for std::endian::native. // * We are NOT assuming a specific value for std::locale("").name(). // * We are NOT assuming a specific value for