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

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

Сыроежка: Следующая простая программа не компилируется компилятором C++ gcc HEAD 10.0.0 20190 [pre2] #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; }[/pre2] Компилятор выдает следующее сообщение [pre2] 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[/pre2] И затем [pre2] 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.[/pre2] Однако эта же самая программа компилируется компилятором Clang HEAD 10.0.0 Вывод программы на консоль: [pre2]f( const A & )[/pre2]

Ответов - 1

Сыроежка: Еще один баг компилятора C++ gcc HEAD 10.0.0 20190 относительно дружественных функций. Следующая программа успешно компилируется с использованием компилятора clang HEAD 10.0.0 [pre2] #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 ); }[/pre2] Вывод программы на консоль: [pre2]t.x = 10[/pre2] Однако если использовать компилятор C++ gcc HEAD 10.0.0 20190, то он выдает следующее сообщение об ошибке [pre2]prog.cc:11:32: error: 'void f(const A&)' should have been declared inside '::' 11 | friend void ::f( const A & ); | ^ [/pre2] Программа будет компилироваться компилятором C++ gcc HEAD 10.0.0 20190, если объявить дружествунную функцию в классе A следующим образом [pre2]friend void ::f<>( const A & );[/pre2] Однако согласно стандарту C++ это не требуется делать, так как указано квалифицированное имя дружественной функции.



полная версия страницы