LINUX.ORG.RU

завалил g++


0

1

Вот этот код http://pastebin.com/dLcDegqp сегфолтит g++. Используется C++11 (компилировать с -std=c++0x).

Код, может быть, и неправильный, но ведь компилятор, наверное, не должен падать даже от неправильного кода.

Проверял на 4.5.1 и 4.6.1.

Отправлять багрепорт? Может кто-нибудь здесь оформит качественнее?

★★★

Последнее исправление: Yareg (всего исправлений: 5)

Судя по бэктрейсу, я загнал его в бесконечную рекурсию.

...
#18054 dependent_type_p (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17484
#18055 0x08076772 in dependent_type_p_r (type=0xb7f22960) at ../../gcc/cp/pt.c:17448
#18056 dependent_type_p (type=0xb7f22960) at ../../gcc/cp/pt.c:17484
#18057 0x080766ec in dependent_type_p_r (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17371
#18058 dependent_type_p (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17484
#18059 0x08076772 in dependent_type_p_r (type=0xb7f22960) at ../../gcc/cp/pt.c:17448
#18060 dependent_type_p (type=0xb7f22960) at ../../gcc/cp/pt.c:17484
#18061 0x080766ec in dependent_type_p_r (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17371
#18062 dependent_type_p (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17484
#18063 0x08076772 in dependent_type_p_r (type=0xb7f22960) at ../../gcc/cp/pt.c:17448
#18064 dependent_type_p (type=0xb7f22960) at ../../gcc/cp/pt.c:17484
#18065 0x080766ec in dependent_type_p_r (type=0xb7f22cc0) at ../../gcc/cp/pt.c:17371
...

Подожду до завтра, если никто ничего полезного не скажет, то буду писать багрепорт.

Yareg ★★★
() автор топика
Ответ на: комментарий от sergej

Точняк - падает

g++: internal compiler error: Segmentation fault (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.6/README.Bugs> for instructions.

ttnl ★★★★★
()

//Поправил в стартовом посте код на чуть более логичный, и чуть-чуть более короткий.

А вот такой вот код уже не роняет (хоть и выдаёт ошибку компиляции, потому что тип operator| никак не может быть F2), хотя изменён совсем чуть-чуть: http://pastebin.com/8CD6zfSY

То есть проявляется баг, когда есть лямбда, возвращающая лямбду, при подстановке в шаблон.

Btw, может кто-нибудь подскажет, какой всё-таки тип должен иметь оператор? В лучшем случае я получаю:

m1.cpp:4:100: error: conversion from ‘const operator|(F1, F2) [with F1 = <lambda(long long unsigned int)>, F2 = <lambda(float)>]::<lambda(long long unsigned int)>’ to non-scalar type ‘const<lambda(long long unsigned int)>’ requested

Или нет вообще никакого пути написать обычную функцию, возвращающую замыкание?

Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

Хотя не, вполне понятно, почему нельзя указать какой-либо тип, потому что замыкание - это анонимный объект анонимного класса, но ведь для однострочной лямбды компилятор может сам определить тип, а для однострочной же обычной функции почему-то не может.

Yareg ★★★
() автор топика

Ох ё, что-то я совсем не узнаю плюсы. Про 11х чтоли почитать

yoghurt ★★★★★
()

Я попытался написать багрепорт, но по моему былинно провалил... Я во-первых случайно нажал «отправить» до того, как что-либо написал, потом подумал, что если напишу в поле additional comment, то оно нормально станет, а оно ненормально стало. А удалить и создать заново похоже нельзя... Да и вообще оформил похоже совсем коряво... http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50791

Yareg ★★★
() автор топика
Ответ на: комментарий от Bad_ptr

>А чё. В этом C++0x, всяких скобочек и прочего барахла не меньше чем в lisp, или perl...

В лиспе один вид скобочек, а здесь целых 4.

Yareg ★★★
() автор топика

у меня тоже падает, на 4.5.3, на 4.4.5 ругается на ошибки и завершается нормально

Harald ★★★★★
()

От кода по ссылке даже я сегфолчусь, чего уж там gcc.

buddhist ★★★★★
()
Ответ на: комментарий от Yareg
$ clang++ main.cpp -std=c++0x
main.cpp:2:37: error: expected expression
F2 operator|(F1 f1, F2 f2) { return [=](unsigned long long x) { return f2(f1(x)); }; };
                                    ^
main.cpp:4:14: error: expected expression                                                                                                    
auto func1 = [](float y)
             ^
main.cpp:9:14: error: expected expression                                                                                                    
auto func2 = [](float x) { return (int)x; };
             ^
3 errors generated.                                                                                                                          
anonymous
()
Ответ на: комментарий от sergej

значит надо скомпилить из транка и проверить :)

Harald ★★★★★
()

Написали, что пофикшено в 4.7...

Yareg ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.