FreeBSD の LLVM で C 言語の整数型リテラル値と整数型定数の論理和を試す2018年09月25日 11時12分26秒

FreeBSD の LLVM で C 言語の整数型リテラル値とマクロ定数の論理和を試した結果から整数型の定数を使うとどうなるかが気になった。既にあれこれのプラットフォームで試そうと思った初心から外れてはいるが、LLVM の動作が気になる。

さて、今度は整数型定数の論理和を行い、LLVM がどのような動作をするか確かめる。

freebsd% cat logical-and-const-int.c 
const int magic = 2;
int main()
{   
    return 1 && magic;
}
freebsd% cc logical-and-const-int.c
logical-and-const-int.c:4:14: warning: use of logical '&&' with constant operand
      [-Wconstant-logical-operand]
    return 1 && magic;
             ^  ~~~~~
logical-and-const-int.c:4:14: note: use '&' for a bitwise operation
    return 1 && magic;
             ^~
             &
logical-and-const-int.c:4:14: note: remove constant to silence this warning
    return 1 && magic;
            ~^~~~~~~~
1 warning generated.
freebsd%
こちらも、リテラル値やマクロ定数と同じ報告がされた。

どうも定数の値が利用時に見えているから報告するようだ。もう少し趣向を変えてみる。定数の定義を論理和の後に持っていく。

freebsd% cat logical-and-const-int2.c
extern const int magic;
int main()
{   
    return 1 && magic;
}

const int magic = 2;
freebsd% cc logical-and-const-int2.c
freebsd%
今度は何の警告や文句もなくコンパイル終了。コンパイラはわざわざ二パスを行ってまで、報告するわけではないようだ。

FreeBSD 11.2-RELEASE の LLVM 6.0.0 で実験。

前回次回