On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 29.08.19 20:55. Заголовок: Еще один баг компилятора C++ gcc HEAD 10.0.0 20190 относительно дружественных функций


Следующая простая программа не компилируется компилятором C++ gcc HEAD 10.0.0 20190
 
#include <iostream>

struct A;

template <class T>
void f( const T & )
{
std::cout << "f( const T & )\n";
}

template <>
void f( const A & )
{
std::cout << "f( const A & )\n";
}

struct A
{
friend void f<A>( const A & );
};

int main()
{
f( A() );

return 0;
}


Компилятор выдает следующее сообщение
 
rog.cc: In instantiation of 'void f(const T&) [with T = A]':
prog.cc:24:12: required from here
prog.cc:8:36: internal compiler error: Segmentation fault
8 | std::cout << "f( const T & )\n";
| ^
0xb8676f crash_signal

И затем
 
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.


Однако эта же самая программа компилируется компилятором Clang HEAD 10.0.0

Вывод программы на консоль:
f( const A & )


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 30.08.19 19:36. Заголовок: Еще один баг компиля..


Еще один баг компилятора C++ gcc HEAD 10.0.0 20190 относительно дружественных функций.

Следующая программа успешно компилируется с использованием компилятора clang HEAD 10.0.0

 
#include <iostream>

template <class T>
void f( const T & );

class A
{
public:
A( int x = 0 ) : x( x ) {}

friend void ::f( const A & );
private:
int x;
};

template <class T>
void f( const T &t )
{
std::cout << "t.x = " << t.x << '\n';
}

int main()
{
A a( 10 );
f( a );
}

Вывод программы на консоль:
t.x = 10

Однако если использовать компилятор C++ gcc HEAD 10.0.0 20190, то он выдает следующее сообщение об ошибке
prog.cc:11:32: error: 'void f(const A&)' should have been declared inside '::' 
11 | friend void ::f( const A & );
| ^


Программа будет компилироваться компилятором C++ gcc HEAD 10.0.0 20190, если объявить дружествунную функцию в классе A следующим образом
friend void ::f<>( const A & );

Однако согласно стандарту C++ это не требуется делать, так как указано квалифицированное имя дружественной функции.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 13
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет