Closed sonsy0929 closed 2 years ago
gcc에서는 compile-time에 결정이 되어 문제없이 사용이 가능했지만, clang에서는 bit-filed가 run-time에 결정이 되는 요소로 추측된다.
CodeGen Layer에서 bit-field가 사용된 구조체 같은 경우 새로운 lvalue를 만드는데 이것이 run-time에 결정을 짓는 요소라고 생각된다. 따라서 컴파일러에서 lvalue로 간주하지 못하기 때문에 assignment를 할 수 없는 것이고, 컴파일러 error log에 'yet'이라는 부사를 사용해서 명시한 것 같다.
만약 위의 코드에서 단순히 b에 따라 true / false 값을 bit-filed가 사용되는 구조체의 변수에 assign하고 다음과 같이 고치면 된다.
void f(bool b) {
a.x = b;
}
트위터에서도 이러한 문제가 올라왔었는데 'yet'으로 농담을 하는 걸로 보인다. https://twitter.com/shafikyaghmour/status/1278927726980632581
MSVC 계열의 컴파일러에서 c++20을 사용했을 때 이와 같은 issue가 발생했는데 고친 것으로 보인다. https://developercommunity.visualstudio.com/t/conditional-that-returns-bitfield-is-not-correctly/1113205
https://bugs.llvm.org/show_bug.cgi?id=13809