Sequence parser overwrites std::u32string
- Vorherrschende Sprache
- C++
- Sterne
- 182
- Forks
- 28
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
Consider the following example.
```cpp
#include
#include
#include
namespace bp = boost::parser;
int main(int argc, char *argv[]) {
auto input = std::string{"ab"};
auto res = std::string();
const auto result = bp::parse(
input
, (bp::char_ >> bp::char_)
, res
);
if (result) {
std::print("Parse successful\n");
std::print("{}\n", res);
} else {
std::print("Parse failed\n");
}
}
```
It outputs
```
Parse successful
ab
```
Now consider this change
```cpp
#include
#include
#include
#include
#include
namespace bp = boost::parser;
namespace rs = std::ranges;
int main(int argc, char *argv[]) {
auto input = std::u32string{U"ab"};
auto res = std::u32string();
const auto result = bp::parse(
input
, (bp::char_ >> bp::char_)
, res
);
if (result) {
std::print("Parse successful\n");
std::print("{}\n", res | bp::as_utf8 | rs::to());
} else {
std::print("Parse failed\n");
}
}
```
It outputs
```
Parse successful
b
```
The issue is here:
```cpp
if constexpr (detail::is_nope_v) {
// nothing to do
} if constexpr (
(!out_container ||
!std::is_same_v) &&
std::is_assignable_v &&
(!std::is_same_v ||
!std::is_integral_v)) {
detail::assign(out, std::move(x));
} else {
detail::move_back(
out, std::move(x), detail::gen_attrs(flags));
}
```
This code adds to a string only if it is an `std::string`. Otherwise, it assigns every character to the same string.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Rechercherichtung
Reproduziere das Beispiel mit std::u32string und boost/parser/parser.hpp und untersuche den gezeigten Block zur Attributzuweisung in der Parser-Implementierung. Überprüfe, dass der Sequenzparser beide Zeichen in der Ausgabe beibehält, anstatt das erste zu überschreiben, und füge einen Regressionstest hinzu oder führe ihn aus, falls das Repository einen geeigneten Ort für Parser-Tests bereitstellt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- cpp
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 55/100