Внутренняя ошибка gcc/g++ (шаблонная лямбда С++)

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

Однако Clang без проблем компилирует его, а также не выдает никаких предупреждений, которые указывали бы на что-то странное.

Я свел проблему к следующему:

#include <functional>

template<typename T>
class A{
    T someVar;
};

template<typename T>
class B {
        int x;

        std::function<A<double>(A<int>&)> someLambda = [&](A<int>& aInt){
            int xVar = x;
            A<double> aRet;
            return aRet;
        };
};

int main(int argc, char** argv){
    B<int> a;
    return 0;
}

Я пробовал как GCC 4.9.2, так и 4.8.4, но оба не сработали (внутренняя ошибка компилятора).

Флаги, которые я использовал:

g++ -std=c++11 -O0 -g -Wall main.cpp -o gccBin

clang++ -std=c++11 -O0 -g -Wall main.cpp -o clangBin

main.cpp: In instantiation of 'struct B<int>::<lambda(class A<int>&)>':
main.cpp:10:7:   required from here
main.cpp:14:24: internal compiler error: in tsubst_copy, at cp/pt.c:12569
             int xVar = x;
                        ^
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

Как я уже говорил, Clang++(3.5.1) компилирует его без проблем. Я также пробовал несколько машин, везде одно и то же.

Есть ли какая-то ошибка, которую я упустил? Я немного поискал в Интернете, и единственные похожие проблемы, которые я смог найти, уже должны были быть исправлены (как утверждает багтрекер).

Может кто-нибудь попробовать запустить этот код на своей машине или дать другой совет?

Спасибо,

Лазарь


person Lazarus535    schedule 28.01.2015    source источник
comment
Если у GCC есть внутренняя ошибка компилятора, это ошибка компилятора, и точка. Это не ваша ошибка. Однако может быть обходной путь.   -  person Mooing Duck    schedule 29.01.2015
comment
Это так странно, что ошибка исчезнет, ​​если мы удалим неиспользуемый xVar O.o Что-то связанное с размером лямбды или стека вызовов или что-то в этом роде?   -  person Mooing Duck    schedule 29.01.2015
comment
проверьте последнюю версию компилятора, если проблема все еще существует, отправьте...   -  person Karoly Horvath    schedule 29.01.2015
comment
Спасибо за разъяснения по поводу редактирования Mooing Duck. Каков будет ваш обходной путь?   -  person Lazarus535    schedule 29.01.2015
comment
gcc.gnu.org/bugzilla/show_bug.cgi?id=64848   -  person Marc Glisse    schedule 29.01.2015
comment
Минимальный рабочий пример выглядит следующим образом: #include ‹functional› template‹typename T› class A { int x; std::function‹void()› someLambda = [&](){x;}; }; int main(){ A‹int› a; }   -  person Ralph Tandetzky    schedule 29.01.2015
comment
Если убрать шаблон, то работает. Если вы удалите x;, то это тоже сработает. Комбинация обоих, кажется, приводит к проблемам.   -  person Ralph Tandetzky    schedule 29.01.2015


Ответы (1)


Это ошибка компилятора. Просто идите вперед и отправьте отчет об ошибке чувакам GCC!

person Ralph Tandetzky    schedule 28.01.2015