also:
- fixed #188
- fixed #189
- updated conformance tests
- version bump
This commit is contained in:
Mark Gillard 2023-01-29 17:49:41 +02:00
parent d00464a7bc
commit 8f31ec8aed
12 changed files with 7216 additions and 3700 deletions

View File

@ -21,13 +21,18 @@ template:
-->
## Unreleased
## v3.3.0
[Released](https://github.com/marzer/tomlplusplus/releases/tag/v3.3.0) 2023-01-29
#### Fixes:
- fixed null pointer dereference in parser when exceptions are disabled (#169) (@ncaklovic)
- fixed spurious warnings in MSVC 19.34
- fixed `toml::parse_file()` on windows for non-ASCII paths
- fixed a spurious table redefinition error (#187) (@jorisvr)
- fixed UB edge-case in integer parsing (#188) (@jorisvr)
- fixed some build issues with Apple-flavoured Clang (#189) (@eddelbuettel)
#### Additions:

View File

@ -2262,14 +2262,21 @@ TOML_IMPL_NAMESPACE_START
}
// range check
if TOML_UNLIKELY(result > static_cast<uint64_t>((std::numeric_limits<int64_t>::max)()) + (sign < 0 ? 1ull : 0ull))
static constexpr auto i64_max = static_cast<uint64_t>((std::numeric_limits<int64_t>::max)());
if TOML_UNLIKELY(result > i64_max + (sign < 0 ? 1u : 0u))
set_error_and_return_default("'"sv,
traits::full_prefix,
std::string_view{ digits, length },
"' is not representable in 64 bits"sv);
if constexpr (traits::is_signed)
{
// avoid signed multiply UB when parsing INT64_MIN
if TOML_UNLIKELY(sign < 0 && result == i64_max + 1u)
return (std::numeric_limits<int64_t>::min)();
return static_cast<int64_t>(result) * sign;
}
else
return static_cast<int64_t>(result);
}
@ -3252,13 +3259,28 @@ TOML_IMPL_NAMESPACE_START
else if (auto tbl = matching_node.as_table(); !is_arr && tbl && !implicit_tables.empty())
{
if (auto found = impl::find(implicit_tables.begin(), implicit_tables.end(), tbl);
found && (tbl->empty() || tbl->is_homogeneous<table>()))
if (auto found = impl::find(implicit_tables.begin(), implicit_tables.end(), tbl); found)
{
implicit_tables.erase(implicit_tables.cbegin() + (found - implicit_tables.data()));
tbl->source_.begin = header_begin_pos;
tbl->source_.end = header_end_pos;
return tbl;
bool ok = true;
if (!tbl->empty())
{
for (auto& [_, child] : *tbl)
{
if (!child.is_table() && !child.is_array_of_tables())
{
ok = false;
break;
}
}
}
if (ok)
{
implicit_tables.erase(implicit_tables.cbegin() + (found - implicit_tables.data()));
tbl->source_.begin = header_begin_pos;
tbl->source_.end = header_end_pos;
return tbl;
}
}
}

View File

@ -515,7 +515,7 @@
__pragma(warning(push)) \
static_assert(true)
#if TOML_HAS_INCLUDE(<CodeAnalysis / Warnings.h>)
#if TOML_HAS_INCLUDE(<CodeAnalysis/Warnings.h>)
#pragma warning(push, 0)
#include <CodeAnalysis/Warnings.h>
#pragma warning(pop)

View File

@ -5,7 +5,7 @@
#pragma once
#define TOML_LIB_MAJOR 3
#define TOML_LIB_MINOR 2
#define TOML_LIB_MINOR 3
#define TOML_LIB_PATCH 0
#define TOML_LANG_MAJOR 1

View File

@ -7,9 +7,6 @@
#define INCLUDE_TOMLPLUSPLUS_H // old guard name used pre-v3
//# Note: these would be included transitively as with any normal C++ project but
//# they're listed explicitly here because this file is used as the source for generate_single_header.py.
#include "impl/preprocessor.h"
TOML_PUSH_WARNINGS;
@ -24,12 +21,12 @@ TOML_DISABLE_SUGGEST_ATTR_WARNINGS;
#pragma warning(disable : 4251) // dll exports for std lib types
#endif
#elif TOML_CLANG
#pragma clang diagnostic ignored "-Wheader-hygiene"
TOML_PRAGMA_CLANG(diagnostic ignored "-Wheader-hygiene")
#if TOML_CLANG >= 12
#pragma clang diagnostic ignored "-Wc++20-extensions"
TOML_PRAGMA_CLANG(diagnostic ignored "-Wc++20-extensions")
#endif
#if TOML_CLANG == 13 && !defined(__APPLE__)
#pragma clang diagnostic ignored "-Wreserved-identifier"
#if TOML_CLANG == 13
TOML_PRAGMA_CLANG(diagnostic ignored "-Wreserved-identifier")
#endif
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -167,122 +167,285 @@ namespace
TEST_CASE("conformance - iarna/invalid")
{
parsing_should_fail(FILE_LINE_ARGS, array_of_tables_1); // array-of-tables-1
SECTION("array-of-tables-1")
{
parsing_should_fail(FILE_LINE_ARGS, array_of_tables_1); // array-of-tables-1
}
parsing_should_fail(FILE_LINE_ARGS, array_of_tables_2); // array-of-tables-2
SECTION("array-of-tables-2")
{
parsing_should_fail(FILE_LINE_ARGS, array_of_tables_2); // array-of-tables-2
}
parsing_should_fail(FILE_LINE_ARGS, bare_key_1); // bare-key-1
SECTION("bare-key-1")
{
parsing_should_fail(FILE_LINE_ARGS, bare_key_1); // bare-key-1
}
parsing_should_fail(FILE_LINE_ARGS, bare_key_2); // bare-key-2
SECTION("bare-key-2")
{
parsing_should_fail(FILE_LINE_ARGS, bare_key_2); // bare-key-2
}
parsing_should_fail(FILE_LINE_ARGS, bare_key_3); // bare-key-3
SECTION("bare-key-3")
{
parsing_should_fail(FILE_LINE_ARGS, bare_key_3); // bare-key-3
}
parsing_should_fail(FILE_LINE_ARGS, comment_control_1); // comment-control-1
SECTION("comment-control-1")
{
parsing_should_fail(FILE_LINE_ARGS, comment_control_1); // comment-control-1
}
parsing_should_fail(FILE_LINE_ARGS, comment_control_2); // comment-control-2
SECTION("comment-control-2")
{
parsing_should_fail(FILE_LINE_ARGS, comment_control_2); // comment-control-2
}
parsing_should_fail(FILE_LINE_ARGS, comment_control_3); // comment-control-3
SECTION("comment-control-3")
{
parsing_should_fail(FILE_LINE_ARGS, comment_control_3); // comment-control-3
}
parsing_should_fail(FILE_LINE_ARGS, comment_control_4); // comment-control-4
SECTION("comment-control-4")
{
parsing_should_fail(FILE_LINE_ARGS, comment_control_4); // comment-control-4
}
parsing_should_fail(FILE_LINE_ARGS, inline_table_imutable_1); // inline-table-imutable-1
SECTION("inline-table-imutable-1")
{
parsing_should_fail(FILE_LINE_ARGS, inline_table_imutable_1); // inline-table-imutable-1
}
parsing_should_fail(FILE_LINE_ARGS, inline_table_imutable_2); // inline-table-imutable-2
SECTION("inline-table-imutable-2")
{
parsing_should_fail(FILE_LINE_ARGS, inline_table_imutable_2); // inline-table-imutable-2
}
#if !TOML_LANG_UNRELEASED
parsing_should_fail(FILE_LINE_ARGS, inline_table_trailing_comma); // inline-table-trailing-comma
SECTION("inline-table-trailing-comma")
{
parsing_should_fail(FILE_LINE_ARGS, inline_table_trailing_comma); // inline-table-trailing-comma
}
#endif // !TOML_LANG_UNRELEASED
parsing_should_fail(FILE_LINE_ARGS, int_0_padded); // int-0-padded
SECTION("int-0-padded")
{
parsing_should_fail(FILE_LINE_ARGS, int_0_padded); // int-0-padded
}
parsing_should_fail(FILE_LINE_ARGS, int_signed_bin); // int-signed-bin
SECTION("int-signed-bin")
{
parsing_should_fail(FILE_LINE_ARGS, int_signed_bin); // int-signed-bin
}
parsing_should_fail(FILE_LINE_ARGS, int_signed_hex); // int-signed-hex
SECTION("int-signed-hex")
{
parsing_should_fail(FILE_LINE_ARGS, int_signed_hex); // int-signed-hex
}
parsing_should_fail(FILE_LINE_ARGS, int_signed_oct); // int-signed-oct
SECTION("int-signed-oct")
{
parsing_should_fail(FILE_LINE_ARGS, int_signed_oct); // int-signed-oct
}
parsing_should_fail(FILE_LINE_ARGS, key_value_pair_1); // key-value-pair-1
SECTION("key-value-pair-1")
{
parsing_should_fail(FILE_LINE_ARGS, key_value_pair_1); // key-value-pair-1
}
parsing_should_fail(FILE_LINE_ARGS, key_value_pair_2); // key-value-pair-2
SECTION("key-value-pair-2")
{
parsing_should_fail(FILE_LINE_ARGS, key_value_pair_2); // key-value-pair-2
}
parsing_should_fail(FILE_LINE_ARGS, multiple_dot_key); // multiple-dot-key
SECTION("multiple-dot-key")
{
parsing_should_fail(FILE_LINE_ARGS, multiple_dot_key); // multiple-dot-key
}
parsing_should_fail(FILE_LINE_ARGS, multiple_key); // multiple-key
SECTION("multiple-key")
{
parsing_should_fail(FILE_LINE_ARGS, multiple_key); // multiple-key
}
parsing_should_fail(FILE_LINE_ARGS, no_key_name); // no-key-name
SECTION("no-key-name")
{
parsing_should_fail(FILE_LINE_ARGS, no_key_name); // no-key-name
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_1); // string-basic-control-1
SECTION("string-basic-control-1")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_1); // string-basic-control-1
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_2); // string-basic-control-2
SECTION("string-basic-control-2")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_2); // string-basic-control-2
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_3); // string-basic-control-3
SECTION("string-basic-control-3")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_3); // string-basic-control-3
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_4); // string-basic-control-4
SECTION("string-basic-control-4")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_control_4); // string-basic-control-4
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_1); // string-basic-multiline-control-1
SECTION("string-basic-multiline-control-1")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_1); // string-basic-multiline-control-1
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_2); // string-basic-multiline-control-2
SECTION("string-basic-multiline-control-2")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_2); // string-basic-multiline-control-2
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_3); // string-basic-multiline-control-3
SECTION("string-basic-multiline-control-3")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_3); // string-basic-multiline-control-3
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_4); // string-basic-multiline-control-4
SECTION("string-basic-multiline-control-4")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_control_4); // string-basic-multiline-control-4
}
parsing_should_fail(FILE_LINE_ARGS,
string_basic_multiline_invalid_backslash); // string-basic-multiline-invalid-backslash
SECTION("string-basic-multiline-invalid-backslash")
{
parsing_should_fail(FILE_LINE_ARGS,
string_basic_multiline_invalid_backslash); // string-basic-multiline-invalid-backslash
}
parsing_should_fail(
FILE_LINE_ARGS,
string_basic_multiline_out_of_range_unicode_escape_1); // string-basic-multiline-out-of-range-unicode-escape-1
SECTION("string-basic-multiline-out-of-range-unicode-escape-1")
{
parsing_should_fail(
FILE_LINE_ARGS,
string_basic_multiline_out_of_range_unicode_escape_1); // string-basic-multiline-out-of-range-unicode-escape-1
}
parsing_should_fail(
FILE_LINE_ARGS,
string_basic_multiline_out_of_range_unicode_escape_2); // string-basic-multiline-out-of-range-unicode-escape-2
SECTION("string-basic-multiline-out-of-range-unicode-escape-2")
{
parsing_should_fail(
FILE_LINE_ARGS,
string_basic_multiline_out_of_range_unicode_escape_2); // string-basic-multiline-out-of-range-unicode-escape-2
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_quotes); // string-basic-multiline-quotes
SECTION("string-basic-multiline-quotes")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_quotes); // string-basic-multiline-quotes
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_multiline_unknown_escape); // string-basic-multiline-unknown-escape
SECTION("string-basic-multiline-unknown-escape")
{
parsing_should_fail(FILE_LINE_ARGS,
string_basic_multiline_unknown_escape); // string-basic-multiline-unknown-escape
}
parsing_should_fail(FILE_LINE_ARGS,
string_basic_out_of_range_unicode_escape_1); // string-basic-out-of-range-unicode-escape-1
SECTION("string-basic-out-of-range-unicode-escape-1")
{
parsing_should_fail(FILE_LINE_ARGS,
string_basic_out_of_range_unicode_escape_1); // string-basic-out-of-range-unicode-escape-1
}
parsing_should_fail(FILE_LINE_ARGS,
string_basic_out_of_range_unicode_escape_2); // string-basic-out-of-range-unicode-escape-2
SECTION("string-basic-out-of-range-unicode-escape-2")
{
parsing_should_fail(FILE_LINE_ARGS,
string_basic_out_of_range_unicode_escape_2); // string-basic-out-of-range-unicode-escape-2
}
parsing_should_fail(FILE_LINE_ARGS, string_basic_unknown_escape); // string-basic-unknown-escape
SECTION("string-basic-unknown-escape")
{
parsing_should_fail(FILE_LINE_ARGS, string_basic_unknown_escape); // string-basic-unknown-escape
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_1); // string-literal-control-1
SECTION("string-literal-control-1")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_1); // string-literal-control-1
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_2); // string-literal-control-2
SECTION("string-literal-control-2")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_2); // string-literal-control-2
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_3); // string-literal-control-3
SECTION("string-literal-control-3")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_3); // string-literal-control-3
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_4); // string-literal-control-4
SECTION("string-literal-control-4")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_control_4); // string-literal-control-4
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_1); // string-literal-multiline-control-1
SECTION("string-literal-multiline-control-1")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_1); // string-literal-multiline-control-1
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_2); // string-literal-multiline-control-2
SECTION("string-literal-multiline-control-2")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_2); // string-literal-multiline-control-2
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_3); // string-literal-multiline-control-3
SECTION("string-literal-multiline-control-3")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_3); // string-literal-multiline-control-3
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_4); // string-literal-multiline-control-4
SECTION("string-literal-multiline-control-4")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_control_4); // string-literal-multiline-control-4
}
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_quotes); // string-literal-multiline-quotes
SECTION("string-literal-multiline-quotes")
{
parsing_should_fail(FILE_LINE_ARGS, string_literal_multiline_quotes); // string-literal-multiline-quotes
}
parsing_should_fail(FILE_LINE_ARGS, table_1); // table-1
SECTION("table-1")
{
parsing_should_fail(FILE_LINE_ARGS, table_1); // table-1
}
parsing_should_fail(FILE_LINE_ARGS, table_2); // table-2
SECTION("table-2")
{
parsing_should_fail(FILE_LINE_ARGS, table_2); // table-2
}
parsing_should_fail(FILE_LINE_ARGS, table_3); // table-3
SECTION("table-3")
{
parsing_should_fail(FILE_LINE_ARGS, table_3); // table-3
}
parsing_should_fail(FILE_LINE_ARGS, table_4); // table-4
SECTION("table-4")
{
parsing_should_fail(FILE_LINE_ARGS, table_4); // table-4
}
parsing_should_fail(FILE_LINE_ARGS, table_invalid_1); // table-invalid-1
SECTION("table-invalid-1")
{
parsing_should_fail(FILE_LINE_ARGS, table_invalid_1); // table-invalid-1
}
parsing_should_fail(FILE_LINE_ARGS, table_invalid_2); // table-invalid-2
SECTION("table-invalid-2")
{
parsing_should_fail(FILE_LINE_ARGS, table_invalid_2); // table-invalid-2
}
parsing_should_fail(FILE_LINE_ARGS, table_invalid_3); // table-invalid-3
SECTION("table-invalid-3")
{
parsing_should_fail(FILE_LINE_ARGS, table_invalid_3); // table-invalid-3
}
parsing_should_fail(FILE_LINE_ARGS, table_invalid_4); // table-invalid-4
SECTION("table-invalid-4")
{
parsing_should_fail(FILE_LINE_ARGS, table_invalid_4); // table-invalid-4
}
}

File diff suppressed because it is too large Load Diff

View File

@ -382,4 +382,15 @@ b = []
parse_expected_value(FILE_LINE_ARGS, "6.9342"sv, 6.9342);
parse_expected_value(FILE_LINE_ARGS, "-995.9214"sv, -995.9214);
}
SECTION("tomlplusplus/issues/187") // https://github.com/marzer/tomlplusplus/issues/187
{
parsing_should_succeed(FILE_LINE_ARGS, R"(
[[a.b]]
x = 1
[a]
y = 2
)"sv);
}
}

View File

@ -541,7 +541,7 @@
__pragma(warning(push)) \
static_assert(true)
#if TOML_HAS_INCLUDE(<CodeAnalysis / Warnings.h>)
#if TOML_HAS_INCLUDE(<CodeAnalysis/Warnings.h>)
#pragma warning(push, 0)
#include <CodeAnalysis/Warnings.h>
#pragma warning(pop)
@ -1115,12 +1115,12 @@ TOML_DISABLE_SUGGEST_ATTR_WARNINGS;
#pragma warning(disable : 4251) // dll exports for std lib types
#endif
#elif TOML_CLANG
#pragma clang diagnostic ignored "-Wheader-hygiene"
TOML_PRAGMA_CLANG(diagnostic ignored "-Wheader-hygiene")
#if TOML_CLANG >= 12
#pragma clang diagnostic ignored "-Wc++20-extensions"
TOML_PRAGMA_CLANG(diagnostic ignored "-Wc++20-extensions")
#endif
#if TOML_CLANG == 13 && !defined(__APPLE__)
#pragma clang diagnostic ignored "-Wreserved-identifier"
#if TOML_CLANG == 13
TOML_PRAGMA_CLANG(diagnostic ignored "-Wreserved-identifier")
#endif
#endif
@ -14262,14 +14262,21 @@ TOML_IMPL_NAMESPACE_START
}
// range check
if TOML_UNLIKELY(result > static_cast<uint64_t>((std::numeric_limits<int64_t>::max)()) + (sign < 0 ? 1ull : 0ull))
static constexpr auto i64_max = static_cast<uint64_t>((std::numeric_limits<int64_t>::max)());
if TOML_UNLIKELY(result > i64_max + (sign < 0 ? 1u : 0u))
set_error_and_return_default("'"sv,
traits::full_prefix,
std::string_view{ digits, length },
"' is not representable in 64 bits"sv);
if constexpr (traits::is_signed)
{
// avoid signed multiply UB when parsing INT64_MIN
if TOML_UNLIKELY(sign < 0 && result == i64_max + 1u)
return (std::numeric_limits<int64_t>::min)();
return static_cast<int64_t>(result) * sign;
}
else
return static_cast<int64_t>(result);
}
@ -15251,13 +15258,28 @@ TOML_IMPL_NAMESPACE_START
else if (auto tbl = matching_node.as_table(); !is_arr && tbl && !implicit_tables.empty())
{
if (auto found = impl::find(implicit_tables.begin(), implicit_tables.end(), tbl);
found && (tbl->empty() || tbl->is_homogeneous<table>()))
if (auto found = impl::find(implicit_tables.begin(), implicit_tables.end(), tbl); found)
{
implicit_tables.erase(implicit_tables.cbegin() + (found - implicit_tables.data()));
tbl->source_.begin = header_begin_pos;
tbl->source_.end = header_end_pos;
return tbl;
bool ok = true;
if (!tbl->empty())
{
for (auto& [_, child] : *tbl)
{
if (!child.is_table() && !child.is_array_of_tables())
{
ok = false;
break;
}
}
}
if (ok)
{
implicit_tables.erase(implicit_tables.cbegin() + (found - implicit_tables.data()));
tbl->source_.begin = header_begin_pos;
tbl->source_.end = header_end_pos;
return tbl;
}
}
}

View File

@ -470,6 +470,10 @@ def load_burnsushi_tests(tests):
))
add_condition(tests['valid']['burntsushi'], 'TOML_LANG_UNRELEASED', (
'string-escape-esc', # \e in strings
'datetime-no-seconds', # omitting seconds from date-times
'inline-table-newline',
'key-unicode',
'string-hex-escape'
))
tests['invalid']['burntsushi'] = load_tests(Path(root_dir, 'invalid'), False)
@ -575,6 +579,8 @@ def write_test_file(name, all_tests):
write('')
write(f'#if {condition}');
for test in tests:
write('')
write(f'\tSECTION("{test.name()}") {{')
write('')
expected = test.expected()
if isinstance(expected, bool):
@ -589,6 +595,9 @@ def write_test_file(name, all_tests):
write(f'\t\tconst auto expected = {s};')
write('\t\tREQUIRE(tbl == expected);')
write('\t});')
write('')
write('\t}')
write('')
if condition != '':
write('')
write(f'#endif // {condition}');