g ++内部编译器错误分段错误与递归constexpr

时间:2016-12-22 21:29:16

标签: c++ c++11 g++ c++14

我最近将我的g ++版本更新为6.3.0(g ++(Homebrew GCC 6.3.0)6.3.0),但现在我得到了g++: internal compiler error: Segmentation fault: 11 (program cc1plus)。 使用以前的版本(我不完全确定,但周围)5.2一切正常。在我的其他计算机上,我使用g ++(Ubuntu 5.2.1-22ubuntu2)5.2.1,这也有效。

代码是:

constexpr bool checkForPrimeNumber(const int p, const int t)
{
    return p <= t or (p % t and checkForPrimeNumber(p, t + 2));
}

constexpr bool checkForPrimeNumber(const int p)
{
    return p == 2 or (p & 1 and checkForPrimeNumber(p, 3));
}

int main() 
{
    static_assert(checkForPrimeNumber(65521), "bug...");
}

我用

编译代码
g++ test.cpp -std=c++11 -fconstexpr-depth=65535

我可以做些什么来解决这个问题?

修改

错误报告sumitted

1 个答案:

答案 0 :(得分:1)

错误来自g ++内部的堆栈溢出。据称我能够增加堆栈(在macOS 10.11.6上)。但是,它并没有解决手头的问题。 我想出了另一个解决方案,将支票分成两个分支,这里是代码:

constexpr bool checkForPrimeNumber(const int p, const int t, const int hi)
{
    return p < hi and (p <= t or (p % t and checkForPrimeNumber(p, t + 2, hi)));
}

constexpr bool checkForPrimeNumber(const int p)
{
    return p == 2 or (p & 1 and (checkForPrimeNumber(p, 3, 32768) or checkForPrimeNumber(p, 3+32768, 65536)));
}

int main()
{
    static_assert(checkForPrimeNumber(65521), "");
}

由于

修改

正如评论中所建议的,解决方案可能是使用C ++ 14:

constexpr bool checkForPrimeNumber(const int p)
{
    if (p < 2)
        return false;
    if (p == 2)
        return true;
    if (~p & 1)
        return false;
    for (int i = 3; i < p; i += 2)
    {
        if (p % i == 0)
            return false;
    }
    return true;
}