我最近将我的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
答案 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;
}