https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112647
Bug ID: 112647 Summary: Inconsistent Comparison Results of Unsigned Bit Fields Across Different Compilers and Architectures Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: guminb at ajou dot ac.kr Target Milestone: --- Overview: An inconsistency has been observed in the behavior of different compilers when comparing `unsigned` bit fields with negative integers. Specifically, MSVC on both x86_64 and ARM64 architectures produces a result of `0` for a comparison that LLVM and GCC evaluate as `1`. This inconsistency raises questions about the correct behavior according to the C standard and the reliability of such comparisons across platforms. Environment: - Compilers: MSVC cl 19.38.33130, LLVM (18.0.0), GCC (trunk) - Architectures: ARM64, x86_64 - Tested in: All compilation options (including various optimization levels) Detailed Steps to Reproduce: The issue is observed when an `unsigned` bit field within a struct is compared with a negative integer. This comparison behaves differently across compilers and architectures, which is demonstrated in the following code snippet: ``` #include <stdio.h> struct FlagHolder { unsigned isActive : 1; }; struct FlagHolder flagStatus = {1}; int main () { // The comparison should be consistent across compilers and architectures printf("(flagStatus.isActive >= -1) result: %d\n", (flagStatus.isActive >= -1)); return 0; } ``` Expected Result: It is unclear what the expected result should be, as per the C standard. The comparison `(flagStatus.isActive >= -1)` yields different results across compilers and architectures, leading to ambiguity about the correct behavior. Actual Result: - ARM64 (MSVC) & x86_64 (MSVC): The output is `0` (false) under all tested options. - LLVM & GCC (Various Architectures): The output is `1` (true) under all tested options. Additional Information: - This issue highlights a significant discrepancy in how unsigned bit field comparisons with negative integers are handled by different compilers. - The inconsistency is particularly concerning for cross-platform development, where such comparisons might lead to different behaviors on different architectures. Suggested Actions: Given the inconsistency observed, it is crucial to clarify the expected behavior according to the C standard. Developers are left unsure about which compiler behavior is correct. It would be beneficial for compiler developers and the C standard committee to provide guidance on this issue. Request for Clarification and Resolution: We request that compiler developers (MSVC, LLVM, and GCC) investigate this issue and provide clarification on the expected behavior. Additionally, a resolution to align the behavior across compilers would significantly enhance the reliability and predictability of C code, especially in cross-platform scenarios.