switch statement case label has only `int` template argument

Abierto
#19 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
cpp
Área
backend

Línea de trabajo

Comienza localizando los puntos de entrada switch_statement y case_statement mencionados en el informe y, a continuación, reproduce el ejemplo con el comportamiento del compilador indicado. Sigue cómo se tipan el valor de case y el argumento de la lambda; el trabajo estará terminado cuando un valor integral de case como 2147483648 se represente y se compare correctamente en lugar de producir “other”, con cobertura de regresión para este comportamiento.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.
Lenguaje dominante
C++
Estrellas
20
Forks
42
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de boostorg/lambda

Todos los issues de boostorg/lambda

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.