@@ -72,6 +72,31 @@ def make_node(cls, operator, left, right, lineno, func=None, type_=None):
7272 return None
7373
7474 a , b = left , right # short form names
75+ if operator in {
76+ "BAND" ,
77+ "BOR" ,
78+ "BXOR" ,
79+ "AND" ,
80+ "OR" ,
81+ "XOR" ,
82+ "MINUS" ,
83+ "MULT" ,
84+ "DIV" ,
85+ "SHL" ,
86+ "SHR" ,
87+ } and not check .is_numeric (a , b ):
88+ errmsg .error (lineno , f"Operator { operator } cannot be used with strings" )
89+ return None
90+
91+ if operator not in {"AND" , "OR" , "XOR" }:
92+ # Non-boolean operators use always numeric operands.
93+ # We ensure operands are correctly converted to 0|1 values if they're boolean
94+ if a .type_ == TYPE .boolean :
95+ a = SymbolTYPECAST .make_node (TYPE .ubyte , a , lineno )
96+
97+ if b .type_ == TYPE .boolean :
98+ b = SymbolTYPECAST .make_node (TYPE .ubyte , b , lineno )
99+
75100 # Check for constant non-numeric operations
76101 c_type = check .common_type (a , b ) # Resulting operation type or None
77102 if TYPE .is_numeric (c_type ): # there must be a common type for a and b
@@ -90,31 +115,13 @@ def make_node(cls, operator, left, right, lineno, func=None, type_=None):
90115 b = SymbolTYPECAST .make_node (c_type , b , lineno ) # ensure type
91116 return SymbolCONSTEXPR (cls (operator , a , b , lineno , type_ = type_ , func = func ), lineno = lineno )
92117
93- if operator in {
94- "BNOT" ,
95- "BAND" ,
96- "BOR" ,
97- "BXOR" ,
98- "NOT" ,
99- "AND" ,
100- "OR" ,
101- "XOR" ,
102- "MINUS" ,
103- "MULT" ,
104- "DIV" ,
105- "SHL" ,
106- "SHR" ,
107- } and not check .is_numeric (a , b ):
108- errmsg .error (lineno , "Operator %s cannot be used with STRINGS" % operator )
109- return None
110-
111118 if check .is_string (a , b ) and func is not None : # Are they STRING Constants?
112119 if operator == "PLUS" :
113120 return SymbolSTRING (func (a .value , b .value ), lineno )
114121
115122 return SymbolNUMBER (int (func (a .text , b .text )), type_ = TYPE .ubyte , lineno = lineno ) # Convert to u8 (boolean)
116123
117- if operator in ( "BNOT" , "BAND" , "BOR" , "BXOR" ) :
124+ if operator in { "BNOT" , "BAND" , "BOR" , "BXOR" } :
118125 if TYPE .is_decimal (c_type ):
119126 c_type = TYPE .long_
120127
@@ -129,7 +136,7 @@ def make_node(cls, operator, left, right, lineno, func=None, type_=None):
129136 return None
130137
131138 if type_ is None :
132- if operator in ( "LT" , "GT" , "EQ" , "LE" , "GE" , "NE" , "AND" , "OR" , "XOR" , "NOT" ) :
139+ if operator in { "LT" , "GT" , "EQ" , "LE" , "GE" , "NE" , "AND" , "OR" , "XOR" } :
133140 type_ = TYPE .boolean
134141 else :
135142 type_ = c_type
0 commit comments