move-assign一个std :: map,其对齐值类型为segfaults

时间:2016-07-15 18:47:37

标签: c++ optimization stl segmentation-fault clang++

以下代码在clang 3.8上对我一直是段错误但在clang 3.7上成功。在这两种情况下我都使用clang++ -std=c++14 -O2 test_case.cpp -o test_case进行编译。如果我在clang 3.8上关闭优化进行编译,程序就会运行完毕。

我猜测编译器在优化时会有一些自由 - 我的问题是:编译器是允许以这种方式进行优化,还是我找到了我的第一个编译器错误?

#include <iostream>
#include <map>

struct __attribute__((aligned(16))) troublesome {
  float s;
};

int main() {
  std::map<int, troublesome> m{{0, troublesome{}}};
  std::map<int, troublesome> n{{1, troublesome{}}};
  std::cout << "GOT HERE" << std::endl;  //  always prints
  m = std::move(n);  //  segfault happens here
  std::cout << "GOT HERE TOO" << std::endl;  // only get here on old clang
}

0 个答案:

没有答案