Skip to content

Commit

Permalink
Add regression tests for #3204 and #3333 (#3629)
Browse files Browse the repository at this point in the history
  • Loading branch information
falbrechtskirchinger committed Jul 31, 2022
1 parent fc3e64c commit 19e4c2b
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Checks: '*,
-readability-identifier-length,
-readability-magic-numbers,
-readability-redundant-access-specifiers,
-readability-simplify-boolean-expr
-readability-simplify-boolean-expr,
-readability-uppercase-literal-suffix'

CheckOptions:
Expand Down
72 changes: 72 additions & 0 deletions tests/src/unit-regression2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,56 @@ inline void from_json(const json& j, for_3312& obj)
}
#endif

/////////////////////////////////////////////////////////////////////
// for #3204
/////////////////////////////////////////////////////////////////////

struct for_3204_foo
{
for_3204_foo() = default;
explicit for_3204_foo(std::string /*unused*/) {} // NOLINT(performance-unnecessary-value-param)
};

struct for_3204_bar
{
enum constructed_from_t
{
constructed_from_none = 0,
constructed_from_foo = 1,
constructed_from_json = 2
};

explicit for_3204_bar(std::function<void(for_3204_foo)> /*unused*/) noexcept // NOLINT(performance-unnecessary-value-param)
: constructed_from(constructed_from_foo) {}
explicit for_3204_bar(std::function<void(json)> /*unused*/) noexcept // NOLINT(performance-unnecessary-value-param)
: constructed_from(constructed_from_json) {}

constructed_from_t constructed_from = constructed_from_none;
};

/////////////////////////////////////////////////////////////////////
// for #3333
/////////////////////////////////////////////////////////////////////

struct for_3333 final
{
for_3333(int x_ = 0, int y_ = 0) : x(x_), y(y_) {}

template <class T>
for_3333(const T& /*unused*/)
{
CHECK(false);
}

int x = 0;
int y = 0;
};

template <>
inline for_3333::for_3333(const json& j)
: for_3333(j.value("x", 0), j.value("y", 0))
{}

TEST_CASE("regression tests 2")
{
SECTION("issue #1001 - Fix memory leak during parser callback")
Expand Down Expand Up @@ -848,6 +898,28 @@ TEST_CASE("regression tests 2")
CHECK(a2.type() == typeid(j));
}
#endif

SECTION("issue #3204 - ambiguous regression")
{
for_3204_bar bar_from_foo([](for_3204_foo) noexcept {}); // NOLINT(performance-unnecessary-value-param)
for_3204_bar bar_from_json([](json) noexcept {}); // NOLINT(performance-unnecessary-value-param)

CHECK(bar_from_foo.constructed_from == for_3204_bar::constructed_from_foo);
CHECK(bar_from_json.constructed_from == for_3204_bar::constructed_from_json);
}

SECTION("issue #3333 - Ambiguous conversion from nlohmann::basic_json<> to custom class")
{
const json j
{
{"x", 1},
{"y", 2}
};
for_3333 p = j;

CHECK(p.x == 1);
CHECK(p.y == 2);
}
}

DOCTEST_CLANG_SUPPRESS_WARNING_POP

0 comments on commit 19e4c2b

Please sign in to comment.