boostorg / boostorg/parser

Sequence parser overwrites std::u32string

Aperta
#327 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.