sonsy0929 / TIL

0 stars 0 forks source link

error: cannot compile this conditional operator yet #7

Closed sonsy0929 closed 2 years ago

sonsy0929 commented 2 years ago
// in clang
struct A {
    int x : 3, y : 5;
} a;

void f(bool b) {
    (b ? a.x : a.y) = 1; // expected error
    b ? (a.x = 1) : (a.x = 0); // expected error
}

https://bugs.llvm.org/show_bug.cgi?id=13809

sonsy0929 commented 2 years ago

gcc에서는 compile-time에 결정이 되어 문제없이 사용이 가능했지만, clang에서는 bit-filed가 run-time에 결정이 되는 요소로 추측된다.

image

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