X3: Incorrect attribute propagation for alternatives with equal attributes
Krzmbrzl opened this issue · 2 comments
Krzmbrzl commented
The docs state
a: A, b: A --> (a | b): A
meaning that an alternative between two rules/parsers that have the same attribute type will have an attribute that is the same as that common type (instead of a variant of the individual types).
However, this is not the case. Alternatives such as the above still result in an attribute of type variant< A, A >
.
While (I think?) automatic propagation rules can correctly propagate this to an attribute of type A
, this is a problem/inconvenience for e.g. semantic actions as they get the immediate attribute type and thus have to work with the variant.
MWE (Godbolt):
#include <boost/spirit/home/x3.hpp>
#include <type_traits>
#include <string>
namespace x3 = boost::spirit::x3;
int main() {
auto validator = [](auto &ctx) {
static_assert(std::is_same_v<std::remove_cvref_t<decltype(x3::_attr(ctx))>, int>);
};
auto parser = (x3::int_ | x3::int_)[validator];
std::string input;
x3::phrase_parse(input.begin(), input.end(), parser, x3::space);
}
cppljevans commented
think this issue has already been raised in issue 722.
Krzmbrzl commented
Yes indeed.