【问题标题】:gcc/g++ internal error (c++ templated lambda)gcc/g++ 内部错误(c++ 模板化 lambda)
【发布时间】:2015-03-27 22:45:11
【问题描述】:

我刚刚对我的程序进行了一些更改,突然 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) 编译它没有问题,正如我所提到的。 我也试了多台机器,到处都一样。

我是否忽略了某种错误?我在互联网上搜索了一下,我能找到的唯一类似问题现在应该已经修复(如 bugtracker 所述)。

也许有人可以尝试在他们的机器上运行此代码或提供其他建议?

谢谢,

拉撒路

【问题讨论】:

  • 如果 GCC 有一个内部编译器错误,那是一个编译器错误,句号。这不是你的错误。但是,可能有一种解决方法。
  • 如果我们删除未使用的xVar O.o 与 lambda 或调用堆栈的大小或其他什么有关,那么错误就会消失,这太奇怪了?
  • 用最新版本的编译器检查,如果问题仍然存在,提交...
  • 感谢您对 Mooing Duck 的编辑进行澄清。您的解决方法是什么?
  • 一个最小的工作示例如下所示:#include template class A { int x; std::function someLambda = [&](){x;}; }; int main(){ A a; }

标签: templates c++11 gcc lambda compiler-bug


【解决方案1】:

这是一个编译器错误。继续向 GCC 伙计们提交错误报告吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多