GCC meldet keinen schlecht formulierten constexpr Lambda-Anruf

9

Nachfolgend sind zwei Testfälle für undefiniertes Verhalten aufgeführt, ausgedrückt als IIFE (Sofort als Lambda-Axpression bezeichnet):

constexpr auto test3 = []{
    int* p{};
    {   
        int x{};
        p = &x;
    }
    return *p; // Undefined Behaviour
}(); // IIFE

constexpr auto test4 = []{
    int x = std::numeric_limits<int>::min();
    int y = -x;  // Undefined Behaviour
    return y;
}();

int main() {}

Wird beim Kompilieren mit GCC-Trunk test4korrekt abgelehnt, da es in a undefiniertes Verhalten zeigt constexpr. Auf der anderen Seite test3wird akzeptiert.

Ist GCC berechtigt zu akzeptieren test3?

Wimalopaan
quelle
4
@ ehemalsknownas_463035818 Der Standard verlangt, dass ALLE UB in einem Kontext diagnostiziert werden.
NathanOliver
@ NathanOliver oh danke. So lerne ich, ich mache Fehler;)
idclev 463035818
Ja. Sieht aus wie ein GCC-Fehler
NathanOliver
Ich werde es melden.
Wimalopaan

Antworten:

7

Ist GCC berechtigt, test3 zu akzeptieren?

Nein, dies ist ein GCC-Fehler. Ich habe es gerade als Fehler # 93389 gemeldet .

Wimalopaan
quelle
Vielen Dank für die Optimierung der Frage und der Antwort!
Wimalopaan