[[noreturn]] - ub
2. ub в конст контексте запрещено
гцц, кланг и мсвц компилят такой код (первые два плюются ворнингами, правда)
[[noreturn]] consteval int foo() {
return 1;
}
это я неправильно понимаю, что такое конст контекст, или тут что-то нарушается?
1. https://eel.is/c++draft/dcl.attr.noreturn#2
2. https://eel.is/c++draft/expr.const#5.7
https://godbolt.org/z/K9fhsTc1e
я думаю, main не вызывается в том же смысле, в каком вызываются все остальные функции в программе http://eel.is/c++draft/basic.start#main-3.sentence-1
чесгря, не понял, причём тут main
прошу прощения, упустил этот момент сейчас еще подумаю
А чем по-вашему отличается вызов main от вызова остальных функций?
что вызов main происходит из-за пределов программы, поэтому у меня есть сомнения, что условие If a function f is called (dcl.attr.noreturn#2) срабатывает для main
А откуда же он происходит?))
оттуда, на что стандарт не распространяется
я думаю, это баг во всех трех компиляторах нигде, видимо, не проверяется, что [[noreturn]] и consteval несовместимы, потому что выйти из такой функции можно только через throw, который (пока) нельзя выполнять в контексте констатных выражений
@Endill Что значит баг, когда компилятор может реагировать на UB как угодно?
скорее потому что в компиляторах не зашито понятие "return из [[noreturn]] - UB" в constexpr контексте
с константными выражениями не все так просто например, к выражению в скобках спецификатора noexcept() предъявляется требование if supplied, shall be a contextually converted constant expression of type bool (except.spec#2), где shall означает diagnosable rule (ISO/IEC Directives, Part 2, 7.2, intro#compliance.general-1). это значит, что если вычисление выражения полагается на неопределенное поведение, то такое выражение перестает удовлетворять требованию выше, и компилятор должен это диагностировать часть вопроса про бан не понял, честно говоря
Обсуждают сегодня