проблема с gcc nullptr

Я портирую существующий код для компиляции под gcc 4.7.2 и столкнулся со странной проблемой с nullptr. Мне удалось свести это к простому тесту:

#include <stdio.h>

const char* g_marker = "Original value";

void SetMarker( const char* s )
{
    g_marker = s;
}

char* Test1()
{
    return SetMarker( "I was here 1" ), nullptr;
}

char* Test2()
{
    SetMarker( "I was here 2" );
    return nullptr;
}

char* Test3()
{
    return SetMarker( "I was here 3"), (char*)NULL;
}

int main()
{
    char* returnValue = Test1();
    printf( "%s\n", g_marker );
}

Скомпилируйте это с помощью g ++ test.cpp -o test -std = c ++ 0x.

Ожидаемый результат - «Я был здесь 1», но я получаю «Исходное значение», указывающее, что SetMarker никогда не вызывается.

Вызов Test2 или Test3 дает ожидаемый результат.

Код, с которым я работаю, использует шаблон из Test3 - изначально без приведения перед NULL - который выдавал ошибку при недопустимом преобразовании из int в char *, поэтому я начал менять все эти NULL на nullptr. К сожалению, это работает неправильно.

Я, вероятно, вынужден изменить код, чтобы использовать шаблон в Test2 (который я предпочитаю в любом случае), но мне любопытно узнать, является ли это ошибкой в ​​компиляторе или я что-то упускаю.


person Snorri Sturluson    schedule 10.04.2013    source источник
comment
Похоже на ошибку в старых версиях g ++; 4.8.0 дает правильный результат.   -  person ecatmur    schedule 10.04.2013


Ответы (1)


Это ошибка в g ++: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52988

g ++ отбрасывает побочные эффекты в выражениях типа nullptr_t, исходя из предположения, что все значения nullptr_t эквивалентны (что они есть, но это не означает, что вы можете игнорировать побочные эффекты!)

Это исправлено в версии 4.8.0; новые выпуски в ветвях 4.x (4.6.4 и 4.7.3) также должны содержать исправление.

person ecatmur    schedule 10.04.2013