switch statement case label has only `int` template argument

Aberta
#19 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
cpp
Domínio
backend

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.

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 <iostream>

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/switch.hpp>

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<int>(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.
Linguagem predominante
C++
Estrelas
20
Forks
42
Métricas de merge de PRs
Nenhum PR com merge em 30d

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de boostorg/lambda

Todas as issues de boostorg/lambda

Issues semelhantes

Mais issues de C++

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.