【C言語】
1bitのint型ビットフィールドと処理系定義の動作

コンパイラで変わる 処理系定義の動作 int bit:1;

warning: comparison is always false due to limited range of data type

警告:データ型の範囲制限ため比較は常に偽になります。
[-Wtype-limits]


■ビットフィールドを「単なる」int 型で定義してはいけない

#include    <stdio.h>
struct  tag {
    int bit:1;//処理系定義の動作
};
int main(void){
    struct tag  x;
    x.bit = 1;
    if(x.bit == 1){
        printf("gccはここに来ない");
    }else{
        printf("gccはここに来る bit = %d\n",x.bit);
    }
}

signed/unsigned が明示されていない単なる int 型のビットフィールドのsigned/unsignedはコンパイラに依存します。
これを処理系定義の動作といいます。

gcc/clangの場合はsigned になるため
1bitしかないビットフィールドは
【0/-1】しか表現できません

1は表現できないので
     if(x.bit == 1){ 
は成立しません。


■ビットフィールドは unsigned int 型で定義する(推奨)

#include    <stdio.h>
struct  tag {
    unsigned int bit:1;
};
int main(void){
    struct tag  x;
    x.bit = 1;
    if(x.bit == 1){
        printf("gccはここに来る bit = %d\n",x.bit);
    }else{
        printf("gccはここに来ない");
    }
}

signed/unsigned が明示されたビットフィールドは
コンパイラに依存しません

ビットフィールドは【0/1】を表現できるので
     if(x.bit == 1){ 
は成立します。

参考:

INT12-C. 式中で使用される単なるintのビットフィールドの型について勝手な想定をしない

https://www.jpcert.or.jp/sc-rules/c-int12-c.html