switch statement case label has only `int` template argument
- Linguagem predominante
- C++
- Estrelas
- 20
- Forks
- 42
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Descrição
Before gcc9, if a template argument is an integral value, no compiler error/warning generated when the specified value is bigger than the integral value MAX.
This leads the following runtime issue:
```
#include
#include
#include
int main() {
using namespace boost;
using namespace boost::lambda;
switch_statement(
_1,
case_statement<2147483648>(std::cout << constant("big")),
default_statement(std::cout << constant("other"))
)(2147483648); // prints 'other'
// static_cast(2147483648) is OK
}
```
This issue prone working can be eliminated in any following way:
- replace case_statement template argument from `int` to `uintmax_t` or `intmax_t` or any bigger than int. This solves that not only `int` parameters can be accepted in later gcc's and clang too.
- switch_statement lambda accepts/casts argument `int`. This solves type safety.
- some other template magic, where at case statement can be set the acceptable integral type, and switch statement recognizes, and uses `common_type` to casts lambda parameter to that.
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Direção de pesquisa
Comece localizando os pontos de entrada switch_statement e case_statement mencionados no relatório e, em seguida, reproduza o exemplo com o comportamento do compilador indicado. Rastreie como o valor de case e o argumento da lambda são tipados; o trabalho estará concluído quando um valor integral de case, como 2147483648, for representado e correspondido corretamente em vez de produzir “other”, com cobertura de regressão para esse comportamento.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- cpp
- Domínio
- backend
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100