Информация об изменениях

Сообщение Re[2]: Бага в VC++ с отрицательными i16 значениями от 20.08.2019 6:06

Изменено 26.08.2019 8:48 DDDX

Re[2]: Бага в VC++ с отрицательными i16 значениями
Здравствуйте, LaptevVV, Вы писали:

КД>>Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение.

КД>>Вкратце: -1i16 преобразуется в int, а не в short.
LVV>И становится положительным?

Нет. Но было бы неплохо, кстати

-1i16 преобразуется в (int)-1.

#include <iostream>

void TEST_FUNC(int) { std::cout<<"TEST_FUNC(int)"<<std::endl; }

void TEST_FUNC(short) { std::cout<<"TEST_FUNC(short)"<<std::endl; }

int main()

{

TEST_FUNC(-1i16); // <----- call of TEST_FUNC(int) !!!

TEST_FUNC((short)-1i16);

TEST_FUNC(1i16);

auto v=-1i16;

std::cout<<"TYPE:"<<typeid(v).name()<<std::endl;

std::cout<<"TYPE:"<<typeid(-1i16).name()<<std::endl;

return 0;

}

--------------------------------------------------------------

Actual Output:

TEST_FUNC(int)

TEST_FUNC(short)

TEST_FUNC(short)

TYPE:int

TYPE:int

Expected Output:

TEST_FUNC(short)

TEST_FUNC(short)

TEST_FUNC(short)

TYPE:short

TYPE:short


Нарваться можно, к примеру, в процессе формирования VARIANT-подобных классов.

Будет вызываться не тот оператор присваивания и, как следствие, назначаться VT_I4 вместо VT_I2.
Re[2]: Бага в VC++ с отрицательными i16 значениями
Здравствуйте, LaptevVV, Вы писали:

КД>>Сегодня закрыли (без исправлений) мой репорт с описанием баги в компиляторе VC++: неправильно обрабатывается отрицательное i16 значение.

КД>>Вкратце: -1i16 преобразуется в int, а не в short.
LVV>И становится положительным?

Нет. Но было бы неплохо, кстати

-1i16 преобразуется в (int)-1.

#include <iostream>

void TEST_FUNC(int) { std::cout<<"TEST_FUNC(int)"<<std::endl; }

void TEST_FUNC(short) { std::cout<<"TEST_FUNC(short)"<<std::endl; }

int main()

{

TEST_FUNC(-1i16); // <----- call of TEST_FUNC(int) !!!

TEST_FUNC((short)-1i16);

TEST_FUNC(1i16);

auto v=-1i16;

std::cout<<"TYPE:"<<typeid(v).name()<<std::endl;

std::cout<<"TYPE:"<<typeid(-1i16).name()<<std::endl;

return 0;

}

--------------------------------------------------------------

Actual Output:

TEST_FUNC(int)

TEST_FUNC(short)

TEST_FUNC(short)

TYPE:int

TYPE:int

Expected Output:

TEST_FUNC(short)

TEST_FUNC(short)

TEST_FUNC(short)

TYPE:short

TYPE:short


Нарваться можно, к примеру, в процессе формирования VARIANT-подобных объектов.

Будет вызываться не тот оператор присваивания и, как следствие, назначаться VT_I4 вместо VT_I2.