class Test
{
    int Field;

    void M()
    {
        int i = 42;
        var c = new C();

        var x = i | Field; // GOOD
        if (true & false) ; // GOOD
        if (c != null ^ this.Field > 0) ; // GOOD
        if (c != null && c.Field > 0) ; // GOOD

        if (c != null & c.Field > 0) ; // $ Alert // BAD
        if (c == null | c.Property == "") ; // $ Alert // BAD
        if (c == null | c[0]) ; // $ Alert // BAD
        if (c == null | c.Method()) ; // $ Alert // BAD

        var b = true;
        b &= c.Method(); // GOOD
        b |= c[0]; // GOOD

        if (c == null | c.Method(out _)) ; // GOOD
        if (c == null | (c.Method() | c.Method(out _))) ; // GOOD
    }

    class C
    {
        public int Field;
        public string Property { get; set; }
        public bool this[int i] { get { return false; } set { } }
        public bool Method() { return false; }
        public bool Method(out int x) { x = 0; return false; }
    }
}
