[msvc]: Интересная ошибка при портировании
От: rg45 СССР  
Дата: 14.11.20 23:40
Оценка: 20 (3)
Привет всем!

При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:

http://coliru.stacked-crooked.com/a/6ae252b1d32a2985

template <typename...F>
void accept(F&&...) { }

template <typename...F>
auto make(F&&...f)
{
   return [=](auto&&...)
   {
      accept(f...);
      accept(f...); // error C2086: 'const main::<lambda_0d72bcd0d3210a40f73932d5a7eecd45> &<<f_0>>': redefinition
   };
}

int main()
{
   make([]{});
}


Как видно, ошибку провоцирует ПОВТОРНОЕ(!) обращение к функции accept. Проявляется только при использовании toolset 142, при 140 все норм. Переключение между C++14 и C++17 эффекта не дает. Семейство GCC ничего против не имеет.

Бага студии, как я понимаю?

[UPD]: Ошибка уходит при переключении на максимальную версию стандарта (/stdc++latest).

[UPD2]: Зарепортил им багу.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.11.2020 0:27 rg45 . Предыдущая версия . Еще …
Отредактировано 15.11.2020 0:02 rg45 . Предыдущая версия .
Re: [msvc]: Интересная ошибка при портировании
От: _NN_ www.nemerleweb.com
Дата: 15.11.20 06:42
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Привет всем!


Привет.

R>При переносе кода с 2015 студии на 2019, получил интересное сообщение об ошибке — якобы повторное определение лямбды. После пошаговой минимизации кода получил такую вот выжимку:


Да, ошибка, попадались не раз.
Какой версией собираете ?
Тут вышла 16.8 там починили несколько похожих ошибок и добавили новых
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: [msvc]: Интересная ошибка при портировании
От: rg45 СССР  
Дата: 15.11.20 09:44
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Какой версией собираете ?

_NN>Тут вышла 16.8 там починили несколько похожих ошибок и добавили новых

У меня сейчас 16.8.1. Позавчера обновлялся.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[3]: [msvc]: Интересная ошибка при портировании
От: _NN_ www.nemerleweb.com
Дата: 15.11.20 10:33
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>Какой версией собираете ?

_NN>>Тут вышла 16.8 там починили несколько похожих ошибок и добавили новых

R>У меня сейчас 16.8.1. Позавчера обновлялся.


Тогда этот пример собирается без проблем:

cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [msvc]: Интересная ошибка при портировании
От: rg45 СССР  
Дата: 15.11.20 10:44
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Тогда этот пример собирается без проблем:


Посмотри, пожалуйста, какие у тебя стоят опции Platform Toolset и C++ Language Standard?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: [msvc]: Интересная ошибка при портировании
От: Gaia  
Дата: 17.11.20 10:27
Оценка: 16 (1)
Здравствуйте, rg45, Вы писали:


R>[UPD2]: Зарепортил им багу.


Кучу багов по лямбдам закрывают, рекомендуя использовать new lamdba processor
Это ключ /Zc:lamdba. Компиляция с /std:c++latest его включает автоматически,

На 16.8.1 (14.28.29333) собирается. Не собирается с /std:c++latest /Zc:lambda-
Отредактировано 17.11.2020 10:32 Gaia . Предыдущая версия .
Re[5]: [msvc]: Интересная ошибка при портировании
От: _NN_ www.nemerleweb.com
Дата: 17.11.20 10:30
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>Тогда этот пример собирается без проблем:


R>Посмотри, пожалуйста, какие у тебя стоят опции Platform Toolset и C++ Language Standard?




**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.8.1
** Copyright (c) 2020 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional>cd %temp%

C:\Users\A\AppData\Local\Temp>cl a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj

C:\Users\A\AppData\Local\Temp>type a.cpp
template <typename...F>
void accept(F&&...) { }

template <typename...F>
auto make(F&&...f)
{
return [=](auto&&...)
{
accept(f...);
accept(f...); // error C2086: 'const main::<lambda_0d72bcd0d3210a40f73932d5a7eecd45> &<<f_0>>': redefinition
};
}

int main()
{
make([]{});
}



msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28)
msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: [msvc]: Интересная ошибка при портировании
От: rg45 СССР  
Дата: 17.11.20 10:35
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28)

_NN>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)

Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: [msvc]: Интересная ошибка при портировании
От: _NN_ www.nemerleweb.com
Дата: 17.11.20 10:39
Оценка: 16 (1)
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28)

_NN>>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)

R>Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.


По умолчанию вроде это 14 и на 14 как раз не падает :D

cl /std:c++14 a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
Microsoft (R) Incremental Linker Version 14.28.29333.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:a.exe
a.obj

cl /std:c++17 a.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29333 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

a.cpp
a.cpp(6): error C2086: 'const main::<lambda_f84292834d425aed7f29e65d92bb41fd> &<<f_0>>': redefinition
a.cpp(6): note: see declaration of '<<f_0>>'
a.cpp(16): note: see reference to function template instantiation 'auto make<main::<lambda_f84292834d425aed7f29e65d92bb41fd>>(main::<lambda_f84292834d425aed7f29e65d92bb41fd> &&)' being compiled
a.cpp(6): error C2086: 'main::<lambda_f84292834d425aed7f29e65d92bb41fd> make::<lambda_df24c58a678bb2227fd803635c6fabc4>::<f_0>': redefinition
a.cpp(6): note: see declaration of 'make::<lambda_df24c58a678bb2227fd803635c6fabc4>::<f_0>'
a.cpp(6): error C2437: '<f_0>': has already been initialized
a.cpp(6): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'make::<lambda_df24c58a678bb2227fd803635c6fabc4>'
a.cpp(6): note: No constructor could take the source type, or constructor overload resolution was ambiguous


Мы у себя вообще собираем всё на c++latest.
Багов всё равно полно что в c++14 что в c++17 так тут хоть код писать удобней писать и более оптимальный получается.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: [msvc]: Интересная ошибка при портировании
От: _NN_ www.nemerleweb.com
Дата: 17.11.20 11:04
Оценка: 16 (1)
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>msvc v142 — vs 2019 c++ x64/x86 build tools (v14.28)

_NN>>msvc v142 — vs 2019 c++ x64/x86 Spectre-mitigated libs (v14.28)

R>Build tools вижу, а используемый стандарт языка не вижу. Там есть еще такие опции /stdc++14, /stdc++17 и /stdc++latest. По-видимому, у тебя автоматом подхватывается /stdc++latest. У меня на latest тоже компилится, а на 14 и 17 падает.


Коллега тут подсказал про /experimental:newLambdaProcessor и действительно с этим флагом собирается.

cl /std:c++17 /experimental:newLambdaProcessor a.cpp

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: [msvc]: Интересная ошибка при портировании
От: rg45 СССР  
Дата: 17.11.20 11:06
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Коллега тут подсказал про /experimental:newLambdaProcessor и действительно с этим флагом собирается.

_NN>

cl /std:c++17 /experimental:newLambdaProcessor a.cpp


Вот же ж... А я на него даже внимания не обратил.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.