标签: gcc6

GCC Bug - 在constexpr中输入/减少数组访问

我发现了一个bug在GCC 6和7(未在GCC 5)内constexpr功能,这导致不同的结果,如果任一函数获取在编译时(错误的结果),或运行时(正确结果)的计算结果.

#include <iostream>

constexpr int bar(int *b) {
  int i = 0;
  b[i++] = 1; // GCC produce here an failure.

  return 0;
}

constexpr int foo()
{
  int tmp[] = {0};
  bar(tmp);

  return tmp[0];
}

constexpr int cexprI = foo();

int main()
{
  std::cout << cexprI << " " << foo() << "\n";

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

实例

问题是数组访问中的增量(也发生在减量)操作.

常量表达式的编译时结果为0(错误),运行时结果为1(正确).

任何人都可以确认此错误并报告给:https://gcc.gnu.org/bugzilla/

我无法在那里创建一个帐户User account creation has been restricted..我联系了管理员,但对我来说这个问题很重要.所以它也想通知你.谢谢!

c++ gcc constexpr c++14 gcc6

5
推荐指数
1
解决办法
153
查看次数

使用CUDA 8.0和GCC 6.x - 错误的功能超载投诉

我正在尝试使用GCC 6.2.1构建一些CUDA代码,这是我的发行版的默认编译器(注意:不是CUDA正式支持的GCC版本,所以你可以称之为实验).这是使用GCC 4.9.3和CUDA版本7.5和8.0构建的代码.

好吧,如果我构建以下(接近)最小的示例:

#include <tuple>

int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

使用命令行

nvcc -std=c++11 -Wno-deprecated-gpu-targets -o main main.cu
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone

/usr/local/cuda/bin/../targets/x86_64-linux/include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone

2 errors detected in the compilation of "/tmp/tmpxft_000071fe_00000000-9_b.cpp1.ii".
Run Code Online (Sandbox Code Playgroud)

这是为什么?我该如何纠正/规避这个?

compatibility cuda g++ libstdc++ gcc6

3
推荐指数
1
解决办法
4099
查看次数

gcc 无法在没有 -O2 的情况下内联函数

我最近遇到了在升级 debian 测试后编译一段代码的问题,得到了 gcc 6.2.1 编译器。我把它归结为这个简单的例子:

inline int func(void) {
    return 0;
}

int main (int argc, char **argv) {
    func();
}
Run Code Online (Sandbox Code Playgroud)

该代码不会与下面的编译:

gcc -o exec code.c # gcc 6.2.1

它失败了:

undefined reference to 'func'

我也在同一台主机上尝试过 gcc 4.8、4.9 和 5,但都失败了。如果我添加,它会编译:

gcc -o exec code.c -O2 # gcc 6.2.1

我真的很好奇为什么它与 -O2 标志一起工作,但不是没有,我希望这能工作?

c optimization gcc inline gcc6

3
推荐指数
1
解决办法
3360
查看次数

g ++:optimization -march = haswell和更新更改数值结果

当我注意到g ++似乎根据所选优化改变结果时,我一直在努力优化性能,当然还在进行回归测试.到目前为止,我认为-O2 -march=[whatever]无论选择何种架构,都应该为数值计算产生完全相同的结果.然而,对于g ++来说似乎并非如此.虽然使用旧架构到ivybridge产生与clang对任何架构相同的结果,但是对于haswell和更新的gcc,我得到了不同的结果.这是gcc中的错误还是我误解了有关优化的内容?我真的很吃惊,因为clang似乎没有表现出这种行为.

请注意,我很清楚差异在机器精度范围内,但它们仍然会干扰我的简单回归检查.

这是一些示例代码:

#include <iostream>
#include <armadillo>

int main(){
    arma::arma_rng::set_seed(3);
    arma::sp_cx_mat A = arma::sprandn<arma::sp_cx_mat>(20,20, 0.1);
    arma::sp_cx_mat B = A + A.t();
    arma::cx_vec eig;
    arma::eigs_gen(eig, B, 1, "lm", 0.001);
    std::cout << "eigenvalue: " << eig << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译使用:

g++ -march=[architecture] -std=c++14 -O2 -o test example.cpp -larmadillo
Run Code Online (Sandbox Code Playgroud)

gcc版本:6.2.1

铿锵版:3.8.0

编译为64位,在Intel Skylake处理器上执行.

c++ g++ compiler-optimization gcc6

3
推荐指数
1
解决办法
1083
查看次数

GCC的-Wyybe -ininitialized是否为基于枚举的switch语句生成-O1的虚假警告?

我有一段以下形式的代码:

typedef enum {A=1,B} EnumType;

int foo (EnumType x)
{
  int r;
  switch (x) {
    case A:
      r = 1;
      break;
    case B:
      r = 2;
      break;
      /*
    default:
      r = -1;
      break;
      */
  }
  return r;
}
Run Code Online (Sandbox Code Playgroud)

我用GCC 6.3.0编译并收到警告:

$ gcc --version
gcc (MacPorts gcc6 6.3.0_2) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ …
Run Code Online (Sandbox Code Playgroud)

c enums gcc compiler-warnings gcc6

2
推荐指数
1
解决办法
225
查看次数

这是有效的 C++ 代码吗?这不正常

int main() {
    
    string str[5] = "ABCD";
    std::cout << str[3] << std::endl;
    std::cout << str[0] << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码打印:

A B C D

A B C D

没看懂,怎么str[3]打印ABCD

编译器:GCC 6.3

c++ arrays string gcc6

2
推荐指数
1
解决办法
601
查看次数

具有内置功能的奇怪GCC6优化

使用GCC6和下面的代码片段,这个测试

if (i > 31 || i < 0) {
Run Code Online (Sandbox Code Playgroud)

false,执行此printf

printf("i > 31 || i < 0 is FALSE, where i=%d", i);
Run Code Online (Sandbox Code Playgroud)

并产生这个非常奇怪的输出(GCC6):

我> 31 || i <0为FALSE,其中i = 32/*奇怪的结果与GCC6!*/

而对于GCC4,我得到:

我> 31 || i <0为,其中i = 32/*结果Ok GCC4*/

看起来很不错.

怎么会这样??

代码段(破旧的代码!):

static int check_params(... input parameters ...) {
    /* Note that value can be 0 (zero) */
    uint32_t value = ....
    int i;

    i = __builtin_ctz(value);
    if (i …
Run Code Online (Sandbox Code Playgroud)

c gcc undefined-behavior gcc4 gcc6

1
推荐指数
1
解决办法
82
查看次数

为什么结构中的函数适用于C语言

如这个小脚本所示.

#include <stdio.h>

struct student{
    short count;
    void (*addCount)();
};

void student_addCount(struct student a){
    a.count++;
}

int main(){
    struct student student;
    student.addCount = student_addCount;
    student.count = 0;
    student.addCount();
    student.addCount();
    student.addCount();
    student.addCount();
    student.addCount();
    printf("%d\n",student.count);
}
Run Code Online (Sandbox Code Playgroud)

我已经添加了一个指向结构内部函数的指针,但我不知道为什么这会起作用,因为函数'addCount'没有接收任何参数,它实际上累计了指定的次数.

我正在使用GCC 6.3.0在不同的环境中编译此代码,例如ideone.com,wandbox.org和WSL中的编译器.

这是证明它与ideone一起工作. https://ideone.com/Cam4xY

c struct function-pointers gcc6

-4
推荐指数
1
解决办法
41
查看次数