switch statement case label has only `int` template argument

Offen
#19 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
cpp
Bereich
backend

Rechercherichtung

Beginne damit, die im Bericht genannten Einstiegspunkte switch_statement und case_statement zu lokalisieren, und reproduziere dann das Beispiel mit dem angegebenen Compilerverhalten. Verfolge, wie der case-Wert und das Lambda-Argument typisiert werden; abgeschlossen ist die Aufgabe, wenn ein integraler case-Wert wie 2147483648 korrekt dargestellt und abgeglichen wird, anstatt „other“ zu erzeugen, mit einer Regressionstestabdeckung für dieses Verhalten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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.
Vorherrschende Sprache
C++
Sterne
20
Forks
42
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus boostorg/lambda

Alle Issues in boostorg/lambda

Ähnliche Issues

Weitere Issues zu C++

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.