i = 0; int* j = (i > 10 ? nullptr : g); i++) // ok
for (size_t i = 0; int* j = i > 10 ? nullptr : g; i++) // fail - variable 'j' is uninitialized when used here
Похоже на баг. Предполагаю, что ворнинг идёт где-то в районе последней итерации, когда цикл завершается
Ого, оно прямо некорректный код генерирует. Причём в очень простом случае. Как минимум поведение у clang/gcc отличается на 180 градусов: https://godbolt.org/z/jMb37G7nq
Так это бесконечный цикл, разве нет? И UB из-за целочисленного переполнения
Да вроде нет: через две итерации завершается.
Зарепортил: https://bugs.llvm.org/show_bug.cgi?id=50038 Посмотрим, что скажут.
а разве в условии циклов for можно объявлять переменные??
https://t.me/ProCxx/444481
зачем только это ввели...
добавил скобок, вроде, стало адекватнее https://godbolt.org/z/TE3Ta5hsT
Да, там в комментарии к багу пишут, что без скобок прям AST не генерируется почему-то
видимо, шланг парсит объявление с инициализацией, как присваивание, возможно, это неправильная работа костыля для поддержки объявлений в условиях
Один мой знакомый заинтересовался и пофиксил. Баг, по-моему, по-своему прекрасен: переменную случайно проинициализировали внутри цикла, а не снаружи. https://github.com/llvm/llvm-project/commit/d29f7f1a7b47345289d63318e7b2a28cc56e169d
Отличная новость, спасибо )
Обсуждают сегодня