以下代码在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
}