GCC nie zgłasza źle sformułowanego wywołania lambda constexpr

9

Poniżej znajdują się dwa przypadki testowe dla niezdefiniowanego zachowania, wyrażone jako IIFE (Natychmiastowa wywoływana ekspresja lambda):

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() {}

Po skompilowaniu z test4łączem GCC jest poprawnie odrzucany, ponieważ wykazuje niezdefiniowane zachowanie w pliku constexpr. Z drugiej strony test3jest akceptowane.

Czy GCC ma prawo zaakceptować test3?

wimalopaan
źródło
4
@ previouslyknownas_463035818 Standard wymaga zdiagnozowania ALL UB w constexpr.
NathanOliver
@NathanOliver o dzięki. tak się uczę, popełniam błędy;)
idclev 463035818
Tak. Wygląda jak błąd GCC
NathanOliver
Zgłosię to.
wimalopaan

Odpowiedzi:

7

Czy GCC ma prawo zaakceptować test3?

Nie, to błąd GCC. Właśnie zgłosiłem to jako błąd # 93389 .

wimalopaan
źródło
Dziękujemy za usprawnienie pytania i odpowiedzi!
wimalopaan