Giter VIP home page Giter VIP logo

cppcodec's Introduction

cppcodec

Build Status Build status

Header-only C++11 library to encode/decode base64, base64url, base32, base32hex and hex (a.k.a. base16) as specified in RFC 4648, plus Crockford's base32.

MIT licensed with consistent, flexible API. Supports raw pointers, std::string and (templated) character vectors without unnecessary allocations. Cross-platform with measured decent performance and without compiler warnings.

Contents


Usage

  1. Import cppcodec into your project (copy, git submodule, etc.)
  2. Add the cppcodec root directory to your build system's list of include directories
  3. Include headers and start using the API.

Since cppcodec is a header-only library, no extra build step is needed. Alternatively, you can install the headers and build extra tools/tests with CMake.

Variants

A number of codec variants exist for base64 and base32, defining different alphabets or specifying the use of padding and line breaks in different ways. cppcodec is designed to let you make a conscious choice about which one you're using, see below for a list of variants.

cppcodec's approach is to implement encoding/decoding algorithms in different classes for namespacing (e.g. cppcodec::base64_rfc4648), with classes and their associated header files named verbatim after the codec variants.

Here is an expected standard use of cppcodec:

#include <cppcodec/base32_crockford.hpp>
#include <cppcodec/base64_rfc4648.hpp>
#include <iostream>

int main() {
  using base32 = cppcodec::base32_crockford;
  using base64 = cppcodec::base64_rfc4648;

  std::vector<uint8_t> decoded = base64::decode("YW55IGNhcm5hbCBwbGVhc3VyZQ==");
  std::cout << "decoded size (\"any carnal pleasure\"): " << decoded.size() << '\n';
  std::cout << base32::encode(decoded) << std::endl; // "C5Q7J833C5S6WRBC41R6RSB1EDTQ4S8"
  return 0;
}

(The prior example included "baseXX_default_*.h" includes, these are not recommended anymore and may eventually get deprecated.)

Currently supported codec variants are:

base64

  • base64_rfc4648 uses the PEM/MIME/UTF-7 alphabet, that is (in order) A-Z, a-z, 0-9 plus characters '+' and '/'. This is what's usually considered the "standard base64" that you see everywhere and requires padding ('=') but no line breaks. Whitespace and other out-of-alphabet symbols are regarded as a parse error.
  • base64_url is the same as base64_rfc4648 (and defined in the same RFC) but uses '-' (minus) and '_' (underscore) as special characters instead of '+' and '/'. This is safe to use for URLs and file names. Padding with '=' is required, it will be generated when encoding to a string and regarded as a parse error if it's not present when decoding.
  • base64_url_unpadded variant is the same as base64_url, but '=' padding characters are optional. When encoding, no padding will be appended to the resulting string. Decoding accepts either padded or unpadded strings.

base32

All base32 variants encode 5 bits as one (8-bit) character, which results in an encoded length of roughly 160% (= 8/5). Their selling point is mainly case-insensitive decoding, no special characters and alphabets that can be communicated via phone.

  • base32_rfc4648 implements the popular, standardized variant defined in RFC 4648. It uses the full upper-case alphabet A-Z for the first 26 values and the digit characters 2-7 for the last ten. Padding with '=' is required and makes the encoded string a multiple of 8 characters. The codec accepts no invalid symbols, so if you want to let the user enter base32 data then consider replacing numbers '0', '1' and '8' with 'O', 'I' and 'B' on input.
  • base32_crockford implements Crockford base32. It's less widely used than the RFC 4648 alphabet, but offers a more carefully picked alphabet and also defines decoding similar characters 'I', 'i', 'L' 'l' as '1' plus 'O' and 'o' as '0' so no care is required for user input. Crockford base32 does not use '=' padding. Checksums are not implemented. Note that the specification is ambiguous about whether to pad bit quintets to the left or to the right, i.e. whether the codec is a place-based single number encoding system or a concatenative iterative stream encoder. This codec variant picks the streaming interpretation and thus zero-pads on the right. (See http://merrigrove.blogspot.ca/2014/04/what-heck-is-base64-encoding-really.html for a detailed discussion of the issue.)
  • base32_hex is the logical extension of the hexadecimal alphabet, and also specified in RFC 4648. It uses the digit characters 0-9 for the first 10 values and the upper-case letters A-V for the remaining ones. The alphabet is conceptually simple, but contains all of the ambiguous number/letter pairs that the other variants try to avoid. It is also less suitable for verbal transmission. Padding with '=' is required and makes the encoded string a multiple of 8 characters.

hex

  • hex_upper outputs upper-case letters and accepts lower-case as well. This is an octet-streaming codec variant and for decoding, requires an even number of input symbols. In other words, don't try to decode (0x)"F", (0x)"10F" etc. with this variant, use a place-based single number codec instead if you want to do this. Also, you are expected to prepend and remove a "0x" prefix externally as it won't be generated when encoding / will be rejected when decoding.
  • hex_lower outputs lower-case letters and accepts upper-case as well. Similar to hex_upper, it's stream-based (no odd symbol lengths) and does not deal with "0x" prefixes.

Philosophy and trade-offs

cppcodec aims to support a range of codecs using a shared template-based implementation. The focus is on a high-quality API that encourages correct use, includes error handling, and is easy to adopt into other codebases. As a header-only library, cppcodec can ship implementations of several codecs and variants while only compiling the ones that you actually use.

Good performance is a goal, but not the topmost priority. In theory, templates allows to write generic code that is optimized for each specialization individually; however, in practice compilers still struggle to produce code that's as simple as a hand-written specialized function. On release builds, depending on the C++ compiler, cppcodec runs in between (approx.) 100% and 300% of time compared to "regular" optimized base64 implementations. Both are beat by highly optimized implementations that use vector instructions (such as this) or buy better performance with larger pre-computed tables (such as Chrome's base64 implementation). Debug builds of cppcodec are slower by an order of magnitude due to the use of templates and abstractions; make sure you use release or minimum-size builds in production.

API

All codecs expose the same API. In the below documentation, replace <codec> with a default alias such as base64, base32 or hex, or with the full namespace such as cppcodec::base64_rfc4648 or cppcodec::base32_crockford.

For templated parameters T and Result, you can use e.g. std::vector<uint8_t>, std::string or anything that supports:

  • .data() and .size() for T (read-only) template parameters,
  • for Result template parameters, also .reserve(size_t), .resize(size_t) and .push_back([uint8_t|char]).

It's possible to support types lacking these functions, consult the code directly if you need this.

Encoding

// Convenient version, returns an std::string.
std::string <codec>::encode(const [uint8_t|char]* binary, size_t binary_size);
std::string <codec>::encode(const T& binary);

// Convenient version with templated result type.
Result <codec>::encode<Result>(const [uint8_t|char]* binary, size_t binary_size);
Result <codec>::encode<Result>(const T& binary);

// Reused result container version. Resizes encoded_result before writing to it.
void <codec>::encode(Result& encoded_result, const [uint8_t|char]* binary, size_t binary_size);
void <codec>::encode(Result& encoded_result, const T& binary);

Encode binary data into an encoded (base64/base32/hex) string. Won't throw by itself, but the result type might throw on .resize().

size_t <codec>::encode(char* encoded_result, size_t encoded_buffer_size, const [uint8_t|char]* binary, size_t binary_size) noexcept;
size_t <codec>::encode(char* encoded_result, size_t encoded_buffer_size, const T& binary) noexcept;

Encode binary data into pre-allocated memory with a buffer size of <codec>::encoded_size(binary_size) or larger.

Returns the byte size of the encoded string excluding null termination, which is equal to <codec>::encoded_size(binary_size).

If encoded_buffer_size is larger than required, a single null termination character ('\0') is written after the last encoded character. The encoded_size() function ensures that the required buffer size is large enough to hold the padding required for the respective codec variant. Provide a buffer of size encoded_size() + 1 to make it a null-terminated C string.

Calls abort() if encoded_buffer_size is insufficient. (That way, the function can remain noexcept rather than throwing on an entirely avoidable error condition.)

size_t <codec>::encoded_size(size_t binary_size) noexcept;

Calculate the (exact) length of the encoded string based on binary size, excluding null termination but including padding (if specified by the codec variant).

Decoding

// Convenient version, returns an std::vector<uint8_t>.
std::vector<uint8_t> <codec>::decode(const char* encoded, size_t encoded_size);
std::vector<uint8_t> <codec>::decode(const T& encoded);

// Convenient version with templated result type.
Result <codec>::decode<Result>(const char* encoded, size_t encoded_size);
Result <codec>::decode<Result>(const T& encoded);

// Reused result container version. Resizes binary_result before writing to it.
void <codec>::decode(Result& binary_result, const char* encoded, size_t encoded_size);
void <codec>::decode(Result& binary_result, const T& encoded);

Decode an encoded (base64/base32/hex) string into a binary buffer.

Throws a cppcodec::parse_error exception (inheriting from std::domain_error) if the input data does not conform to the codec variant specification. Also, the result type might throw on .resize().

size_t <codec>::decode([uint8_t|char]* binary_result, size_t binary_buffer_size, const char* encoded, size_t encoded_size);
size_t <codec>::decode([uint8_t|char]* binary_result, size_t binary_buffer_size, const T& encoded);

Decode an encoded string into pre-allocated memory with a buffer size of <codec>::decoded_max_size(encoded_size) or larger.

Returns the byte size of the decoded binary data, which is less or equal to <codec>::decoded_max_size(encoded_size).

Calls abort() if binary_buffer_size is insufficient, for consistency with encode(). Throws a cppcodec::parse_error exception (inheriting from std::domain_error) if the input data does not conform to the codec variant specification.

size_t <codec>::decoded_max_size(size_t encoded_size) noexcept;

Calculate the maximum size of the decoded binary buffer based on the encoded string length.

If the codec variant does not allow padding or whitespace / line breaks, the maximum decoded size will be the exact decoded size.

If the codec variant allows padding or whitespace / line breaks, the actual decoded size might be smaller. If you're using the pre-allocated memory result call, make sure to take its return value (the actual decoded size) into account.

cppcodec's People

Contributors

efidler avatar gtvalentine avatar jbzdarkid avatar jpetso avatar kronuz avatar kurt-nj avatar ndusart avatar phoebe-leong avatar smasherprog avatar soapgentoo avatar thrimbor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cppcodec's Issues

Cannot use decode with std::array

Hello,

It seems you are forcing the Result template type to have a push_back method, which std::array doesn't have.

I was wondering if it would be easy to use the iterator range constructors of standard containers instead, to allow using a lot more container types.

I didn't dive into the code yet, do you think this is an easy change? If so, I could open a PR soon.

Thanks

Owner access for jpetso

I don't seem to have write access to edit the project description or repository anymore, which is a logical consequence of not being with Topology anymore. I figure I won't be able to accept pull requests either.

However, I'd like to continue being a maintainer. Forking is suboptimal as the URL changes and I can't take the stars with me. @efidler, can you make me co-owner or something to that effect?

Add `url` codec, a.k.a. urlencode/urldecode

Since cppcodec aims for implementations of common encodings, URL encoding seems like a good candidate to add to the pool.

Implementing it will require a few changes to the codec template, because unlike base-N encodings, URL encoding results in variable length encoded strings (depending on the number of escaped characters).

That means the encoded_size() assertion about returning the exact number of encoded result bytes, without looking at the actual string, cannot hold anymore. The number of encoded bytes can be anywhere between the original size and three times original size. These should probably be represented by an encoded_min_size() and encoded_max_size(), but using either for allocation of result bytes is probably not too great of an idea as they're both likely off.

Having an unknown output size also means we won't be able to use the "pre-allocation & write to data pointer" optimization that mutable data pointer types make use of right now. Using push_back() instead of direct data access for variable-length encodings should be fixable with a bit of thought, though.

Maybe we can have something like an "average encoding ratio" for variable-length codecs like URL encoding, ideally defaulted by the library but customizable by the user. To preserve the same consistent encode()/decode() API that's used for base-N codecs, it might work better to make the average encoding ratio a template argument to the url codec class.

Given the difference in processing, a class structure entirely separate from base-N codecs might be necessary, similar to the planned baseN_num codecs which need a different encode()/decode() API as well.

minimum required cMake version is 3.19 and not 3.13

Using the project with cMake 3.16 fails with the error:

CMake Error at build/cppcodec-src/CMakeLists.txt:70 (set_target_properties):
  INTERFACE_LIBRARY targets may only have whitelisted properties.  The
  property "LINKER_LANGUAGE" is not allowed.

The property set on Line 70: set_target_properties(cppcodec PROPERTIES LINKER_LANGUAGE CXX)
works only with cMake version 3.19 or newer.

Is there any option to remove the property? Or should the minimum required cMake version on Line 1 be increased to cmake_minimum_required(VERSION 3.19)?

Add saltpack's baseX family of codecs

See https://saltpack.org/armoring for the specification. Should be a fun exercise as follow-up to adding Base85, since the calculation (and differences from currently implemented codecs) is largely the same.

It seems the alphabet and binary block size should be passed as template arguments.

For the calculation of encoded/decoded sizes, in case the current calculation isn't synonymous with their "most direct way to compute [it]", we could use log2() from https://github.com/elbeno/constexpr. I'll have to check whether it is synonymous.

For block sizes > 8 bytes, a bignum library will be necessary. I'm thinking we should probably statically assert in this case if included without an extra bignum library, and use a specialized template (that doesn't assert) otherwise. We can provide an extra header to provide that specialized template, avoiding to e.g. hardcode a boost dependency in the main header.

Implement validation functions

Sometimes I'm not interested in actually decoding a base-N string into its binary form, I just want to know whether it's valid and then keep it as encoded string.

I was thinking that the current API makes this possible with an empty Result type that makes put() a no-op, one would merely watch for a parse_error being thrown. This could be wrapped in an API like this:

bool <codec>::valid(const T& encoded);
bool <codec>::valid(const [char|uint8_t]* encoded, size_t encoded_size);

It would also be nice if this method didn't throw internally, because that will hit gdb/lldb when listening for arbitrary throws. Given that, the decode() functions should probably expose more overloads that take a std::error_code and set that to an error, instead of throwing. This would also make it possible to use cppcodec entirely without RTTI internals.

Base36 Support

Adding base62 and/or base36 might also be useful, they are often used for url shorteners in particular, since they just include numbers/letters, no special characters.

Add `base64_url_unpadded` variant

Both base64_rfc4648 and base64_url are padded with = characters, which needlessly (for most use cases) blows up the size of the encoded string. RFC 6920 specifies an unpadded variant of base64url, which should be easy to add and seems like a valuable addition.

Wikipedia also talks about base64 variants for XML names and identifiers. Once base64_url_unpadded is in, let's create an issue for those.

Unreachable code warning

I grabbed the latest release, but it still complains about the unreachable code in one place when I build it in release mode:

deps\cppcodec\cppcodec\detail\stream_codec.hpp(66): warning C4702: unreachable code

Do you know how to fix it?

Catch2 v2.3.0 doesn't compile with gcc11

Hi,
Catch2 doesn't compile with gcc version 11.2.0 (Ubuntu 11.2.0-19ubuntu1) :

cppcodec-src/test/catch/single_include/catch2/catch.hpp:7485:58: error: call to non-โ€˜constexprโ€™ function โ€˜long int sysconf(int)โ€™
7485 | constexpr static std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;
| ^~~~~~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,

This is known issue by the maintainers.
Could you please update the git submodule to point to a more recent release version of Catch ?

Thank you in advance

parse error: codec expects padded input string but padding was invalid

I have this output in querey[0]:

{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}

I must remove the { }so I did it fast with:

querey[0].erase(std::remove(querey[0].begin(), querey[0].end(), '{'), querey[0].end());
querey[0].erase(std::remove(querey[0].begin(), querey[0].end(), '}'), querey[0].end());

Now I'm getting this error when trying to do this auto decodeBase64 = base64::decode(querey[0]);

terminate called after throwing an instance of 'cppcodec::padding_error'
what(): parse error: codec expects padded input string but padding was invalid

Narrowing error on master with -Wc++11-narrowing

/Users/aianus/src/cryptopals/vendor/cppcodec/cppcodec/detail/stream_codec.hpp:244:65: error: constant expression evaluates to 4294967040 which cannot be narrowed to type 'cppcodec::detail::alphabet_index_t' (aka 'unsigned short') [-Wc++11-narrowing]
    static constexpr const alphabet_index_t stop_character_mask{~0xFFu};

The expression ~0xFFu is evaluated to a 32-bit integer on my system and alphabet_index_t is 16 bits.

Reverting this commit fixes the problem but I am not sure how to fix the problem and maintain the MSVC build time optimization

Doesn't compile with VC14

I get this error just including base64_default_rfc4648.hpp:

Error C2535 'void cppcodec::detail::base64::pad(Result &,ResultState &,std::enable_if<,size_t>::type)': member function already defined or declared

num_possible_values() incorrectly parsed when using windows.h

Visual Studio 2017 15.8.7
MSVC v140_xp
Windows 7.1A SDK

The problem is caused by the <Windows.h> header file that includes macro definitions named max and min. Seeing this definition, the preprocessor replaces the max identifier in the expression with the macro definition, eventually leading to invalid syntax.

// CodecVariant::symbol() provides a symbol for an index.
// Use recursive templates to get the inverse lookup table for fast decoding.
template <typename T>
static CPPCODEC_ALWAYS_INLINE constexpr size_t num_possible_values()
{
return static_cast<size_t>(
static_cast<intmax_t>(std::numeric_limits<T>::max())
- static_cast<intmax_t>(std::numeric_limits<T>::min()) + 1);
}

SO question

Adding the preprocessor definition to the project works as intended.

Add a base85 codec

cppcodec doesn't have a base85 codec yet, but should.

The z85 variant would fit the current framework quite well and should be possible to implement without changes to the existing classes, I think. There's an existing C implementation at https://github.com/judsonx/base85 (with the same MIT license that cppcodec is using) that's mainly focused on Ascii85 but also supports z85, so it might have some useful parts (block encoding/decoding) that we could adopt.

Ascii85 seems worthwhile too but has header/footer parts which need extra care, so I suggest to implement a "barebone" codec variant such as z85 first.

The base85 variant suggested in RFC 1924 would also work for that purpose, but seems less widespread.

Encode from/decode to float vector does not work as expected

Hi - I'm hoping to use cppcodec in a small fluid dynamics program, and the program needs to write .vtu files for ParaView (VTK uses an xml-based format, and allows base64 encoding of float arrays). I expected to be able to do the following because std::vector allows .data() and .size():

using base64 = cppcodec::base64_rfc4648;
std::vector<float> original({235.2158, 1.0});
std::string encoded = base64::encode(original);

and I assumed that it would know that each entry is 4 bytes. It doesn't. This is how to encode from a float vector:

std::string encoded = base64::encode((const char*)original.data(), (size_t)(sizeof(float)*original.size()));

This returns the encoded string NzdrQwAAgD8=

Now, it also seemed as if I could decode to a float vector using:

std::vector<float> decoded = base64::decode<std::vector<float>>(encoded);

but that gives me a vector of size 8 with the first entry decoded[0] equal to 55. Obviously it's assuming I'm decoding to uint8_t. How can I confirm my encoding by decoding to a std::vector<float> ?

Warning on VC14 in

Minor thing, but you have a warning in raw_result_buffer.hpp, which many projects treat as an error and can be problematic:

Warning C4100 'result': unreferenced formal parameter raw_result_buffer.hpp 67

XML identifier compatible base64 variants

Wikipedia mentions two base64 variants for use in XML identifiers:

  • a variant using .- for use in XML name tokens (nmtoken) - likely cppcodec name: base64_xml_nmtoken
  • a variant using _: for use in more restricted XML identifiers (name) - likely cppcodec name: base64_xml_name.

These don't seem to be specified in any high-profile standard, or I missed it. The only reference to base64 in XML I found with a quick Google search was the XML Schema type base64Binary, which uses newline-optional MIME base64 and thus isn't XML-specific.

So these are presumably not in use all that much, and probably super low on the list of codecs to add. If anyone would like to see either of these variants in cppcodec, please comment on this bug.

Improve command line tools

I should be able to select the variant for the tool's codec family, and should be able to pipe input data through stdin. Depending on that choice (or the default), only a single codec should be printed as output. The current way of passing data through argv should continue to be supported.

Got SIGABRT when b64decode to a preallocated buffer

I'm trying to decode a string, which is a b64encoded 64-byte signature, to a preallocated buffer.
Since its length is known exactly, it might not be a good practice to allocate a buffer bigger than that.
But the decoded_max_size requires 2 more bytes.
Is it possible to give a more precise calculation on the length of output?
If not, what about throw a concise exception?

#include <cppcodec/base64_rfc4648.hpp>
#include <cppcodec/hex_lower.hpp>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

using base64 = cppcodec::base64_rfc4648;
using hex    = cppcodec::hex_lower;

#define uint8_p(x) reinterpret_cast<uint8_t*>(x)

string s = "JHeNMtgqWq51F+MyZlz+tA5HywxhLSH3Cq+gTFs6M8iJWgONT7Ll9t1NwH2m2hCXWpoeWT90w3+LkIG/wNaiEg==";

void try_1()
{
    auto signature = base64::decode(s);
    cout << signature.size() << endl;
    puts(hex::encode(signature).c_str());
}

void try_2()
{
    uint8_t signature[64];
    base64::decode(signature, sizeof(signature), s);
    puts(hex::encode(signature, 64).c_str());
}

int main()
{
    cout << base64::decoded_max_size(s.size()) << endl; // 66
    try_1();
    try_2();
}
$ ./main 
66
64
24778d32d82a5aae7517e332665cfeb40e47cb0c612d21f70aafa04c5b3a33c8895a038d4fb2e5f6dd4dc07da6da10975a9a1e593f74c37f8b9081bfc0d6a212
[1]    13521 abort (core dumped)  ./main
$ valgrind ./main 
==13588== Memcheck, a memory error detector
==13588== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==13588== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==13588== Command: ./main
==13588== 
66
64
24778d32d82a5aae7517e332665cfeb40e47cb0c612d21f70aafa04c5b3a33c8895a038d4fb2e5f6dd4dc07da6da10975a9a1e593f74c37f8b9081bfc0d6a212
==13588== 
==13588== Process terminating with default action of signal 6 (SIGABRT)
==13588==    at 0x5C84E97: raise (raise.c:51)
==13588==    by 0x5C86800: abort (abort.c:79)
==13588==    by 0x40472B: init<cppcodec::data::raw_result_buffer> (include/cppcodec/detail/../data/raw_result_buffer.hpp:61)
==13588==    by 0x40472B: void cppcodec::detail::codec<cppcodec::detail::base64<cppcodec::detail::base64_rfc4648> >::decode<cppcodec::data::raw_result_buffer>(cppcodec::data::raw_result_buffer&, char const*, unsigned long) (include/cppcodec/detail/codec.hpp:268)
==13588==    by 0x404659: cppcodec::detail::codec<cppcodec::detail::base64<cppcodec::detail::base64_rfc4648> >::decode(char*, unsigned long, char const*, unsigned long) (include/cppcodec/detail/codec.hpp:298)
==13588==    by 0x404618: unsigned long cppcodec::detail::codec<cppcodec::detail::base64<cppcodec::detail::base64_rfc4648> >::decode<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(char*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (include/cppcodec/detail/codec.hpp:314)
==13588==    by 0x401BD4: unsigned long cppcodec::detail::codec<cppcodec::detail::base64<cppcodec::detail::base64_rfc4648> >::decode<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(unsigned char*, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (include/cppcodec/detail/codec.hpp:307)
==13588==    by 0x4018AB: try_2() (main.cpp:26)
==13588==    by 0x401970: main (main.cpp:34)
==13588== 
==13588== HEAP SUMMARY:
==13588==     in use at exit: 89 bytes in 1 blocks
==13588==   total heap usage: 5 allocs, 4 frees, 74,012 bytes allocated
==13588== 
==13588== LEAK SUMMARY:
==13588==    definitely lost: 0 bytes in 0 blocks
==13588==    indirectly lost: 0 bytes in 0 blocks
==13588==      possibly lost: 0 bytes in 0 blocks
==13588==    still reachable: 89 bytes in 1 blocks
==13588==         suppressed: 0 bytes in 0 blocks
==13588== Rerun with --leak-check=full to see details of leaked memory
==13588== 
==13588== For counts of detected and suppressed errors, rerun with: -v
==13588== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
[1]    13588 abort (core dumped)  valgrind ./main

Here's my comiler

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 

Static assertion fails after pulling #40

Operating System: Windows 10 x64
Compiler: Visual C++ (VS 2017/15.6.4)

Static assert on line 266 of file access.hpp fails:

static_assert(std::is_same<
        decltype(create_state(*(std::string*)nullptr, specific_t())),
        array_access_result_state<std::string>>::value,
        "std::string must be handled by array_access_result_state");

image

Can't build cppcodec

I'm using the catch-devel-2.2.2-1.fc28.x86_64 package on Fedora 28, I also use GCC 8.1.
Running cmake . finishes without error:

-- The CXX compiler identification is GNU 8.1.1
-- Check for working CXX compiler: /usr/lib64/ccache/c++
-- Check for working CXX compiler: /usr/lib64/ccache/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PkgConfig: /usr/bin/pkg-config (found version "1.4.2")
-- Checking for module 'catch'
-- Found catch, version 2.2.2
-- Found system Catch2, not using bundled version
-- Configuring done
-- Generating done
-- Build files have been written to: /etc/opt/cppcodec/cppcodec

But when I execute make I get a lot of errors regarding test_cppcodec.cpp:

[ 95%] Built target minimal_decode
In file included from /etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:25:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____0()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:128:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("0"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:128:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:129:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("000"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:129:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:130:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("000000"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:130:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:131:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("000000000"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:131:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:134:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("00======"), const cppcodec::symbol_error&); // no padding for Crockford
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:134:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:135:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("Uu"), const cppcodec::symbol_error&); // only a checksum symbol here
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:135:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:136:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("++"), const cppcodec::symbol_error&); // make sure it's not base64
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:136:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:137:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("//"), const cppcodec::symbol_error&); // ...ditto
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:137:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____8()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:327:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("0"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:327:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:328:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("00"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:328:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:329:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("00==="), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:329:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:330:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("0======="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:330:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:331:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("000====="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:331:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:332:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("000000=="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:332:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:335:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("W0======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:335:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:336:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("X0======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:336:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:337:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("Y0======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:337:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:338:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("Z0======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:338:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:339:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("CPNM UOJ1"), const cppcodec::symbol_error&); // no spaces
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:339:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:340:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("CPNM-UOJ1"), const cppcodec::symbol_error&); // no dashes
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:340:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____14()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:434:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("A"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:434:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:435:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("AA"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:435:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:436:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("AA==="), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:436:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:437:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("A======="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:437:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:438:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("AAA====="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:438:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:439:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("AAAAAA=="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:439:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:442:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("0A======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:442:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:443:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("1A======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:443:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:444:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("8A======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:444:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:445:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("9A======"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:445:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:446:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("GEZD GNBV"), const cppcodec::symbol_error&); // no spaces
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:446:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:447:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base32::decode("GEZD-GNBV"), const cppcodec::symbol_error&); // no dashes
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:447:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____20()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:574:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:574:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:575:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AA"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:575:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:576:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("ABCDE"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:576:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:577:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A==="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:577:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:578:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AAAA===="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:578:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:579:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AAAAA==="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:579:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:582:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A&B="), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:582:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:583:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("--"), const cppcodec::symbol_error&); // this is not base64url
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:583:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:584:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("__"), const cppcodec::symbol_error&); // ...ditto
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:584:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____26()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:677:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decodestd::string("Zg="), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:677:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:685:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:685:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:686:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AAAAA"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:686:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:689:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A&B"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:689:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:690:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("++"), const cppcodec::symbol_error&); // this is not standard base64
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:690:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:691:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("//"), const cppcodec::symbol_error&); // ...ditto
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:691:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____32()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:785:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:785:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:786:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AA"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:786:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:787:9: error: cannot declare reference to โ€˜const class cppcodec::padding_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("ABCDE"), const cppcodec::padding_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:787:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::padding_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:788:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A==="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:788:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:789:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AAAA===="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:789:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:790:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("AAAAA==="), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:790:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:793:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("A&B="), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:793:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:794:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("++"), const cppcodec::symbol_error&); // this is not standard base64
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:794:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:795:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(base64::decode("//"), const cppcodec::symbol_error&); // ...ditto
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:795:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____38()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:886:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("0"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:886:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:887:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("000"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:887:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:890:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("1g"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:890:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:891:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("66 6f"), const cppcodec::symbol_error&); // no spaces
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:891:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:892:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("66-6f"), const cppcodec::symbol_error&); // no dashes
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:892:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp: In function โ€˜void ____C_A_T_C_H____T_E_S_T____44()โ€™:
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:983:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("0"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:983:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:984:9: error: cannot declare reference to โ€˜const class cppcodec::invalid_input_length&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("000"), const cppcodec::invalid_input_length&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:984:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::invalid_input_length&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:987:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("1G"), const cppcodec::symbol_error&);
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:987:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:988:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("66 6F"), const cppcodec::symbol_error&); // no spaces
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:988:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:989:9: error: cannot declare reference to โ€˜const class cppcodec::symbol_error&โ€™, which is not a typedef or a template type argument
REQUIRE_THROWS_AS(hex::decode("66-6F"), const cppcodec::symbol_error&); // no dashes
^~~~~~~~~~~~~~~~~
/etc/opt/cppcodec/cppcodec/test/test_cppcodec.cpp:989:9: error: โ€˜constโ€™ qualifiers cannot be applied to โ€˜const cppcodec::symbol_error&โ€™
make[2]: *** [test/CMakeFiles/test_cppcodec.dir/build.make:63: test/CMakeFiles/test_cppcodec.dir/test_cppcodec.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1404: test/CMakeFiles/test_cppcodec.dir/all] Error 2
make: *** [Makefile:141: all] Error 2

Verify performance fix for Windows

Performance isn't the topmost priority for cppcodec, but it is a concern. https://github.com/gaspardpetit/base64 did a great job at benchmarking various base64 encoders/decoders on Windows with Visual Studio 2015.

The bad news is that cppcodec performed worse than I think it should (by a factor of somewhere between 3 to 10 times) in that benchmark.

The good news is that it's likely only an issue on Windows, and there is a likely fix which I proposed in gaspardpetit/base64#2. Quote:

[On Linux] I found that after a refactor, cppcodec performance was noticeably slower than before. I traced this down to GCC not inlining some of the lowest-level templated functions (cppcodec is a template-crazy beast), and adding __attribute((always_inline)) made it go back to its original, okay performance. (That attribute also works on clang.)

I wonder whether the same thing is happening with MSVC. However, lacking a Windows system, I can't test it. So here's my request: Would you be able to add another line for MSVC's __forceinline to https://github.com/tplgy/cppcodec/blob/master/cppcodec/detail/config.hpp and see it that makes a difference in performance?

If I'm doing it right, I think it should look like this:

#if __GNUC__ || __has_attribute(always_inline)
#define CPPCODEC_ALWAYS_INLINE inline __attribute__((always_inline))
#if defined(_MSC_VER) && !__INTEL_COMPILER && _MSC_VER >= 1310 // since Visual Studio .NET 2003
#define CPPCODEC_ALWAYS_INLINE inline __forceinline
#else
#define CPPCODEC_ALWAYS_INLINE inline
#endif

The bad news is that the benchmarking appears to have been a one-off, and the maintainer didn't respond to my issue.

Either way this should still be tackled:

  • Get someone with a Windows machine to try out the above fix, or
  • alternatively, improve unit testing so it includes performance tests, so as to let Travis CI test the fix for us.
  • Rerun Gaspard's benchmark both on Linux and Windows and submit the results to his issue queue.
  • Hope that Gaspard will eventually also modify his comment at https://stackoverflow.com/a/41094722 that has the potential to dissuade people from using cppcodec, even if it's much better for gcc/clang users.

Add base32_hex variant

cppcodec currently supports base32_rfc4648 ("standard" base32) and base32_crockford. For full RFC 4648 coverage, only its base32hex variant is left to implement. It should be called base32_hex in accordance to other codec variants' naming.

Adding the base32_hex variant consists of a few rather straightforward tasks:

  • Copying base32_rfc4648.hpp into a new file base32_hex.hpp and changing the class names as well as the actual alphabet.
  • Adding a base32_default_hex.hpp file, again probably copied and adapted from base32_default_rfc4648.hpp.
  • Adding tests in test/test_cppcodec.cpp (between base32_crockford and base32_rfc4648, for alphabetical order). Tests can be copied and adapted from base32_rfc4648 as that's the closest match.
  • Adding a description of the base32_hex variant to README.md so people know that it exists and what it's all about.

Stream support

At this time, cppcodec does not offer a good way of encoding or decoding a byte stream of unknown length. This is a significant shortcoming in the API and something usable should be added. The obvious choice here is support for the stream operators (<<, >>) that pipe from and to a cppcodec class. We'll likely want a new class because unlike the existing encode()/decode() functions, this one needs to track state as part of its member variables, i.e. the data source and possibly information about the current offset.

I'd like to make this a focus area for v0.3.

base64_url decode long string got run-time error

Hello,
First of all, thank you for your lib!

I have run-time error when trying to decode the below:

std::string mydecode = base64_url::decode<std::string>("EtwFwjS7cNIZjXcufbR6r6mg8s1_e-jfObtENsgjQamDuuJZlT7lpReGgtl1bac77Lk0IDPNyFkhR-Rdv9kDBYcERUWMt_WBrqErnuciol09BReP7UCwfgwFftv3FMjRE29WpXInQ4vfFtbyd6YLN5AKAVZ-r5EcBYVdnjqli4zDR8TCKOPo1jhV5g3w43PPVSsc3KJS_C-i7SlJoGAjfWD97mL6kTYnoivbh_f61Vch9jS_zxslmqD_If0ZM7VtPxFE0oIPlbAka-OchPjrdEwF1lQqsmB1mE8zRF3yvPrz8tDjic3EQEjr-i6_F4NHJNg6tUq466DozbWct2ZrQdh70I764VrcktS1M93Rm5KjzEMUv7MmFjb03sWw7j2iVuLWgir4BqxGdS8E6yo8Vw12xk0pjOAaeuE_yzRRh_k_yAH2BkPFc7cibOYWcfOBL8-fd3PAbmSTm1BRSmZA3Epo9W93zVB6yazqk8YdvRmAde6WgPP8z2jckrLwpK88TySatMllkuxvpto0ZvdSDXNw2SfDuFrmxWPTsk0BHpS5jxjhV4R_FPyzTUAGijS_FJsfwXn-G1ii8AsDvyVuq3Om0cQmJ-mNC8pqTXvTvso556hIm1jHb-mIfhiwZk4gJONTqqQ_NPTA1vl6Omzznbl_BKSLlc4OcdIGqEdRll4NNjoxdVqWlNaS4O9L0C2UfEqK7NWAPymiLBCFYxSWsbul9seiZvS_UhV3I7lDDwy-40mQV9UN0wXV0cRZVpr_YrRvE9-SWtpyb3ZOi5y52d6oP6MeMe-kRvQRF8OkXsw-oXhkpOpMzcKi2xq9Q4k6Vuvme5s1PHCN8gAC4fJ4jm2H_XsJA6qFyDfXAdvcu6Z_GINje-sPRFc7Gpl88tbmPOAT-k0a-xeGMSd8h5xYIXcnrGjqXHFRxl_qPA");

Could you help me out?

FTBFS on Fedora Rawhide

[ 62%] Building CXX object test/CMakeFiles/test_cppcodec.dir/test_cppcodec.cpp.o
cd /builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/x86_64-redhat-linux-gnu/test && /usr/bin/c++   -I/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994  -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -mcet -fcf-protection -std=c++11 -Wall -pedantic   -o CMakeFiles/test_cppcodec.dir/test_cppcodec.cpp.o -c /builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp
make[2]: Leaving directory '/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/x86_64-redhat-linux-gnu'
In file included from /builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:25:
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____0()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:128:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("0"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:128:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:129:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("000"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:129:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:130:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("000000"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:130:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:131:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("000000000"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:131:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:134:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("00======"), cppcodec::symbol_error&); // no padding for Crockford
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:134:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:135:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("Uu"), cppcodec::symbol_error&); // only a checksum symbol here
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:135:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:136:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("++"), cppcodec::symbol_error&); // make sure it's not base64
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:136:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:137:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("//"), cppcodec::symbol_error&); // ...ditto
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:137:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____8()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:327:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("0"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:327:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:328:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("00"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:328:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:329:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("00==="), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:329:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:330:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("0======="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:330:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:331:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("000====="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:331:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:332:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("000000=="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:332:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:335:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("W0======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:335:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:336:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("X0======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:336:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:337:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("Y0======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:337:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:338:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("Z0======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:338:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:339:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("CPNM UOJ1"), cppcodec::symbol_error&); // no spaces
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:339:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:340:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("CPNM-UOJ1"), cppcodec::symbol_error&); // no dashes
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:340:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____14()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:434:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("A"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:434:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:435:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("AA"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:435:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:436:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("AA==="), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:436:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:437:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("A======="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:437:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:438:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("AAA====="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:438:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:439:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("AAAAAA=="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:439:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:442:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("0A======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:442:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:443:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("1A======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:443:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:444:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("8A======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:444:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:445:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("9A======"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:445:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:446:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("GEZD GNBV"), cppcodec::symbol_error&); // no spaces
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:446:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:447:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base32::decode("GEZD-GNBV"), cppcodec::symbol_error&); // no dashes
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:447:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____20()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:574:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:574:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:575:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AA"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:575:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:576:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("ABCDE"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:576:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:577:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A==="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:577:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:578:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AAAA===="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:578:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:579:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AAAAA==="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:579:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:582:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A&B="), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:582:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:583:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("--"), cppcodec::symbol_error&); // this is not base64url
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:583:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:584:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("__"), cppcodec::symbol_error&); // ...ditto
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:584:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____26()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:682:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:682:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:683:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AAAAA"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:683:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:686:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A&B"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:686:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:687:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("++"), cppcodec::symbol_error&); // this is not standard base64
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:687:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:688:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("//"), cppcodec::symbol_error&); // ...ditto
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:688:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____32()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:782:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:782:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:783:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AA"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:783:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:784:9: error: cannot declare reference to 'class cppcodec::padding_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("ABCDE"), cppcodec::padding_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:784:9: error: 'const' qualifiers cannot be applied to 'cppcodec::padding_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:785:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A==="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:785:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:786:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AAAA===="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:786:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:787:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("AAAAA==="), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:787:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:790:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("A&B="), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:790:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:791:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("++"), cppcodec::symbol_error&); // this is not standard base64
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:791:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:792:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(base64::decode("//"), cppcodec::symbol_error&); // ...ditto
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:792:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____38()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:883:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("0"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:883:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:884:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("000"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:884:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:887:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("1g"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:887:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:888:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("66 6f"), cppcodec::symbol_error&); // no spaces
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:888:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:889:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("66-6f"), cppcodec::symbol_error&); // no dashes
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:889:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp: In function 'void ____C_A_T_C_H____T_E_S_T____44()':
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:980:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("0"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:980:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:981:9: error: cannot declare reference to 'class cppcodec::invalid_input_length&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("000"), cppcodec::invalid_input_length&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:981:9: error: 'const' qualifiers cannot be applied to 'cppcodec::invalid_input_length&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:984:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("1G"), cppcodec::symbol_error&);
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:984:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:985:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("66 6F"), cppcodec::symbol_error&); // no spaces
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:985:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:986:9: error: cannot declare reference to 'class cppcodec::symbol_error&', which is not a typedef or a template type argument
         REQUIRE_THROWS_AS(hex::decode("66-6F"), cppcodec::symbol_error&); // no dashes
         ^~~~~~~~~~~~~~~~~
/builddir/build/BUILD/cppcodec-65e512dceb2d544c71111396f8ffd9e851d73994/test/test_cppcodec.cpp:986:9: error: 'const' qualifiers cannot be applied to 'cppcodec::symbol_error&'
{standard input}: Assembler messages:
{standard input}: Error: .size expression for test_cppcodec.cpp does not evaluate to a constant

This might be either due to catch update (1.x โ†’ 2.x) or gcc update (7.2.1 โ†’ 8.0.1)..

Help is very appreciated. Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.