The actual intelligence behind the oddexpr check.
This is the main table that controls whether we warn about certain combinations of binary operators. If you want to NOT issue a warning about a particular combination of operators, then just leave it out of the table.
The keys in the table have the form (outer-class . inner-class). For
details about these classes see vl-odd-binop-class. Loosely speaking, a
key like
Whereas a key like (:plus-class . :shift-class) would match expressions of the following forms:
In other words, the inner-op is the "sub" operation, and the outer-op is the "top" operation.
Note that we never have keys where the outer-op has a higher precedence than
the inner operation, such as
Because of the precedence rules,
NOTE see the source code for this table for additional comments giving motivation for these actions, etc.
Definition:
(defconst *vl-odd-binops-table* '(((:shift-class . :plus-class) . :check-precedence) ((:bitand-class . :plus-class) . :check-precedence) ((:xor-class . :plus-class) . :check-precedence) ((:bitor-class . :plus-class) . :check-precedence) ((:logand-class . :plus-class) . :check-type) ((:logor-class . :plus-class) . :check-type) ((:plus-class . :minus-class) . :check-precedence-plusminus) ((:shift-class . :minus-class) . :check-precedence) ((:bitand-class . :minus-class) . :check-precedence) ((:xor-class . :minus-class) . :check-precedence) ((:bitor-class . :minus-class) . :check-precedence) ((:logand-class . :minus-class) . :check-type) ((:logor-class . :minus-class) . :check-type) ((:shift-class . :shift-class) . :check-precedence) ((:bitand-class . :shift-class) . :check-precedence) ((:xor-class . :shift-class) . :check-precedence) ((:bitor-class . :shift-class) . :check-precedence) ((:logand-class . :shift-class) . :check-type) ((:logor-class . :shift-class) . :check-type) ((:rel-class . :rel-class) . :check-type) ((:cmp-class . :rel-class) . :check-type) ((:bitand-class . :rel-class) . :check-type-unless-topargs-boolean) ((:xor-class . :rel-class) . :check-type-unless-topargs-boolean) ((:bitor-class . :rel-class) . :check-type-unless-topargs-boolean) ((:cmp-class . :cmp-class) . :check-type) ((:bitand-class . :cmp-class) . :check-type-unless-topargs-boolean) ((:xor-class . :cmp-class) . :check-type) ((:bitor-class . :cmp-class) . :check-type-unless-topargs-boolean) ((:xor-class . :bitand-class) . :check-precedence) ((:logand-class . :bitand-class) . :check-type-unless-topargs-boolean) ((:logor-class . :bitand-class) . :check-type-unless-topargs-boolean) ((:logand-class . :xor-class) . :check-type) ((:logor-class . :xor-class) . :check-type) ((:logand-class . :bitor-class) . :check-type-unless-topargs-boolean) ((:logor-class . :bitor-class) . :check-type-unless-topargs-boolean) ((:logor-class . :logand-class) . :check-precedence)))
Definition:
(defconst *vl-odd-binops-table* '(((:shift-class . :plus-class) . :check-precedence) ((:bitand-class . :plus-class) . :check-precedence) ((:xor-class . :plus-class) . :check-precedence) ((:bitor-class . :plus-class) . :check-precedence) ((:logand-class . :plus-class) . :check-type) ((:logor-class . :plus-class) . :check-type) ((:plus-class . :minus-class) . :check-precedence-plusminus) ((:shift-class . :minus-class) . :check-precedence) ((:bitand-class . :minus-class) . :check-precedence) ((:xor-class . :minus-class) . :check-precedence) ((:bitor-class . :minus-class) . :check-precedence) ((:logand-class . :minus-class) . :check-type) ((:logor-class . :minus-class) . :check-type) ((:shift-class . :shift-class) . :check-precedence) ((:bitand-class . :shift-class) . :check-precedence) ((:xor-class . :shift-class) . :check-precedence) ((:bitor-class . :shift-class) . :check-precedence) ((:logand-class . :shift-class) . :check-type) ((:logor-class . :shift-class) . :check-type) ((:rel-class . :rel-class) . :check-type) ((:cmp-class . :rel-class) . :check-type) ((:bitand-class . :rel-class) . :check-type-unless-topargs-boolean) ((:xor-class . :rel-class) . :check-type-unless-topargs-boolean) ((:bitor-class . :rel-class) . :check-type-unless-topargs-boolean) ((:cmp-class . :cmp-class) . :check-type) ((:bitand-class . :cmp-class) . :check-type-unless-topargs-boolean) ((:xor-class . :cmp-class) . :check-type) ((:bitor-class . :cmp-class) . :check-type-unless-topargs-boolean) ((:xor-class . :bitand-class) . :check-precedence) ((:logand-class . :bitand-class) . :check-type-unless-topargs-boolean) ((:logor-class . :bitand-class) . :check-type-unless-topargs-boolean) ((:logand-class . :xor-class) . :check-type) ((:logor-class . :xor-class) . :check-type) ((:logand-class . :bitor-class) . :check-type-unless-topargs-boolean) ((:logor-class . :bitor-class) . :check-type-unless-topargs-boolean) ((:logor-class . :logand-class) . :check-precedence)))