Sequence parser overwrites std::u32string
- Lingua principale
- C++
- Stelle
- 182
- Fork
- 28
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
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.
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Direzione di ricerca
Riproduci l’esempio usando std::u32string con boost/parser/parser.hpp e ispeziona il blocco mostrato di assegnazione degli attributi nell’implementazione del parser. Verifica che il parser di sequenze conservi entrambi i caratteri nell’output invece di sovrascrivere il primo, e aggiungi o esegui un test di regressione se il repository fornisce una posizione appropriata per i test del parser.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- cpp
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 55/100