Stack exaustion while value_from(std::filesystem::path)
RoyBellingan opened this issue · comments
PLEASE DON'T FORGET TO "STAR" THIS REPOSITORY :)
Are you inviting me to have multiple account or more friend ?
Version of Boost
1.84
Steps necessary to reproduce the problem
#include <boost/json/src.hpp>
#include <filesystem>
#include <iostream>
namespace bj = boost::json;
int main() {
std::filesystem::path p = "/cry";
auto ref = bj::value_from(p);
auto ser = bj::serialize(ref);
std::cout << ser;
}
if the path is EMPTY it works fine, but if there is something it leads to a stack exausting crash, remaining struct inside those 2
loop (first one is gcc the other clang, quite similar but a bit different)
Also using
void tag_invoke(const bj::value_from_tag&, bj::value& jv, const std::filesystem::path& t) {
jv = t.string();
}
std::filesystem::path tag_invoke(const bj::value_to_tag<std::filesystem::path>&, const boost::json::value& jv) {
std::filesystem::path path = std::string_view(jv.as_string());
return path;
}
or
void tag_invoke(const bj::value_from_tag&, bj::value& jv, const std::filesystem::__cxx11::path& t) {
jv = t.string();
}
std::filesystem::path tag_invoke(const bj::value_to_tag<std::filesystem::__cxx11::path>&, const boost::json::value& jv) {
std::filesystem::path path = std::string_view(jv.as_string());
return path;
}
Does not help (in fact looks like they are not even used...)
The solution is to put the tag_invoke INSIDE the boost::json namespace...
This already happened in another case, for std::chrono,
I think it should be worth to add a note into this page
https://www.boost.org/doc/libs/1_84_0/libs/json/doc/html/json/conversion/custom_conversions.html
To express that, sometimes... you have to put in namespace to help it!
The solution (to the error) is to not treat path
as a sequence. It's not what users want anyway (everyone would prefer conversion to a string). This will result in value_to<path>
being a compilation error.
The next step will be to add a conversion category for paths.
The solution is to put the tag_invoke INSIDE the boost::json namespace...
I think it should be worth to add a note into this page
From that page:
embed the user-defined type into the arguments list (e.g. by using a tag type template such as value_to_tag) so that its associated namespaces and entities are examined when name lookup is performed.
Maybe we should be less cryptic.
Yes maybe just drop a few lines about that specific example ?
Is ok if I do a pull request for
json/doc/qbk/conversion/custom.qbk
Line 54 in db92f8c
You can create a PR, but before please look for a good place to put the note.