VS bug: new int(1,2,"wtf")
От: Кодт Россия  
Дата: 05.03.15 15:02
Оценка: 32 (6) :))) :)))
Чудеса си-стайл-каста.
int* p;

// вот так - задумано
p = new int(1); // new int(1)
p = new int(12.34); // new int(12)

p = new int("wtf"); // ошибка компиляции

// а вот так - внезапно!
p = new int(1,2,3); // new int(3) !
p = new int(1,2,3.4); // new int(3) - т.е. static_cast
p = new int(1,2,"wtf"); // new int((int)"wtf") - т.е. reinterpret_cast
p = new int(foo(),bar(),buz(),"wtf"); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf")

gcc совершенно справедливо ругается во всех случаях, кроме первых двух.

UPD. VS2012. На 2013 там ICE, на 2015 работает правильно.
Перекуём баги на фичи!
Отредактировано 06.03.2015 10:04 Кодт . Предыдущая версия . Еще …
Отредактировано 05.03.2015 15:04 Кодт . Предыдущая версия .
VS bug: new int(1,2,"wtf")
От: Constructor  
Дата: 06.03.15 00:31
Оценка: 4 (1)
Здравствуйте, Кодт, Вы писали:

К>Чудеса си-стайл-каста.


Visual Studio 2013 (w/o updates) выдает internal compiler error, если закомментировать строчку p = new int("wtf");:

main.cpp(26): fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\trees.h', line 588)
To work around this problem, try simplifying or changing the program near the locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information


Забавно, что в Visual Studio 2013 Update 4 упоминаемая строка в файлике trees.h имеет номер уже 589.

В Visual Studio 2015 этот баг, похоже, поправили: ошибки также выдаются во всех случаях, кроме первых двух (свежайшая версия Visual C++ 19.0 доступна онлайн на http://rise4fun.com/vcpp).
Отредактировано 06.03.2015 0:33 Constructor . Предыдущая версия .
Re: VS bug: new int(1,2,"wtf")
От: Кодт Россия  
Дата: 06.03.15 10:03
Оценка:
Здравствуйте, Constructor, Вы писали:

C>Visual Studio 2013 (w/o updates) выдает internal compiler error, если закомментировать строчку p = new int("wtf");:

C>Забавно, что в Visual Studio 2013 Update 4 упоминаемая строка в файлике trees.h имеет номер уже 589.

Сейчас проверил — оказывается, да: VS2012 (она же 11.0, компилятор 17.00) молча хавает, а 2013 (12.0 / 18.00) update 3 даёт айс в строке 588.

C>В Visual Studio 2015 этот баг, похоже, поправили: ошибки также выдаются во всех случаях, кроме первых двух (свежайшая версия Visual C++ 19.0 доступна онлайн на http://rise4fun.com/vcpp).
Перекуём баги на фичи!
Отредактировано 06.03.2015 10:06 Кодт . Предыдущая версия .
Re: VS bug: new int(1,2,"wtf")
От: andy1618 Россия  
Дата: 06.03.15 13:17
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Тема: VS bug: new int(1,2,"wtf")


Может, "перековать на фичу" и ввести числовую константу WTF? Типа как число PI, только большое и страшное
Re[2]: VS bug: new int(1,2,"wtf")
От: Кодт Россия  
Дата: 06.03.15 14:16
Оценка: :)
Здравствуйте, andy1618, Вы писали:

A>Может, "перековать на фичу" и ввести числовую константу WTF? Типа как число PI, только большое и страшное


Weird Transcedent Floating ?
Перекуём баги на фичи!
Re: VS bug: new int(1,2,"wtf")
От: jyuyjiyuijyu  
Дата: 07.03.15 01:45
Оценка: -2
Здравствуйте, Кодт, Вы писали:

К>p = new int(1,2,3); // new int(3) !

К>p = new int(1,2,3.4); // new int(3) — т.е. static_cast
К>p = new int(1,2,"wtf"); // new int((int)"wtf") — т.е. reinterpret_cast
К>p = new int(foo(),bar(),buz(),"wtf"); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf")

а что тут странного? а вот так было бы понятнее?

p = new int((1,2,3)); // new int(3) !
p = new int((1,2,3.4)); // new int(3) — т.е. static_cast
p = new int((1,2,"wtf")); // new int((int)"wtf") — т.е. reinterpret_cast
p = new int((foo(),bar(),buz(),"wtf")); // выполняет foo(), bar(), buz(), отдаёт new int((int)"wtf

некоторые извращенцы специально вызывают несколько функций через запятую и реазультат всегда в таком выражении после последней запятой
Re: VS bug: new int(1,2,"wtf")
От: rus blood Россия  
Дата: 07.03.15 10:09
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Чудеса си-стайл-каста.

К>
double* p = new double(1, 2);
К>


VC2013.4, ICE
Имею скафандр — готов путешествовать!
Re[2]: VS bug: new int(1,2,"wtf")
От: Кодт Россия  
Дата: 07.03.15 11:20
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>а что тут странного? а вот так было бы понятнее?


Возможно, что компилятор VS2012 самостоятельно подвёрстывает лишние скобки в абстрактное синтаксическое дерево для единообразия с каким-нибудь другим похожим узлом.
Например, чтобы единообразно обрабатывать new T, new T(), new T(x).
Причём, скорее всего, это делается исключительно для встроенных типов (а, может быть, и для всех POD-ов — тут надо поэкспериментировать).
Потому что new T(x,y,z) для типов с пользовательскими конструкторами — это не то же самое, что new T((x,y,z)) == new T(z).

Но это маленькие футбольные хитрости (с) Маслаченко.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.