@@ -1003,7 +1003,8 @@ def address_taken(self) -> Set[str]:
10031003 return self .lhs .address_taken ().union (self .rhs .address_taken ())
10041004
10051005 def variables_used (self ) -> Set [str ]:
1006- return self .lhs .variables_used ().union (self .rhs .variables_used ())
1006+ lhsvars = set ([]) if self .lhs .is_variable else self .lhs .variables_used ()
1007+ return self .rhs .variables_used ().union (lhsvars )
10071008
10081009 def callees (self ) -> Set [str ]:
10091010 return set ([])
@@ -1051,6 +1052,12 @@ def tgt(self) -> "ASTExpr":
10511052 def arguments (self ) -> List ["ASTExpr" ]:
10521053 return self ._args
10531054
1055+ def variables_used (self ) -> Set [str ]:
1056+ result : Set [str ] = set ([])
1057+ for arg in self .arguments :
1058+ result = result .union (arg .variables_used ())
1059+ return result
1060+
10541061 def accept (self , visitor : "ASTVisitor" ) -> None :
10551062 visitor .visit_call_instr (self )
10561063
@@ -1142,6 +1149,10 @@ def lvalid(self) -> int:
11421149 def lhost (self ) -> "ASTLHost" :
11431150 return self ._lhost
11441151
1152+ @property
1153+ def is_constant_value_expression (self ) -> bool :
1154+ return self .lhost .is_constant_value_expression
1155+
11451156 @property
11461157 def offset (self ) -> "ASTOffset" :
11471158 return self ._offset
@@ -1204,6 +1215,14 @@ def is_variable(self) -> bool:
12041215 def is_global (self ) -> bool :
12051216 return False
12061217
1218+ @property
1219+ def is_ssa (self ) -> bool :
1220+ return False
1221+
1222+ @property
1223+ def is_constant_value_expression (self ) -> bool :
1224+ return self .is_ssa
1225+
12071226 @abstractmethod
12081227 def transform (self , transformer : "ASTTransformer" ) -> "ASTLHost" :
12091228 ...
@@ -1226,12 +1245,14 @@ def __init__(
12261245 vtype : Optional ["ASTTyp" ],
12271246 parameter : Optional [int ] = None ,
12281247 globaladdress : Optional [int ] = None ,
1248+ ssa : bool = False ,
12291249 vdescr : Optional [str ] = None ) -> None :
12301250 ASTNode .__init__ (self , "varinfo" )
12311251 self ._vname = vname
12321252 self ._vtype = vtype
12331253 self ._parameter = parameter
12341254 self ._globaladdress = globaladdress
1255+ self ._ssa = ssa
12351256 self ._vdescr = vdescr # describes what the variable holds
12361257
12371258 @property
@@ -1258,6 +1279,10 @@ def globaladdress(self) -> Optional[int]:
12581279 def is_global (self ) -> bool :
12591280 return self .globaladdress is not None
12601281
1282+ @property
1283+ def is_ssa (self ) -> bool :
1284+ return self ._ssa
1285+
12611286 @property
12621287 def vdescr (self ) -> Optional [str ]:
12631288 return self ._vdescr
@@ -1304,6 +1329,10 @@ def varinfo(self) -> "ASTVarInfo":
13041329 def is_global (self ) -> bool :
13051330 return self .varinfo .is_global
13061331
1332+ @property
1333+ def is_ssa (self ) -> bool :
1334+ return self .varinfo .is_ssa
1335+
13071336 @property
13081337 def vname (self ) -> str :
13091338 return self .varinfo .vname
@@ -1625,6 +1654,10 @@ def is_integer_constant(self) -> bool:
16251654 def is_integer_constant_zero (self ) -> bool :
16261655 return False
16271656
1657+ @property
1658+ def is_constant_value_expression (self ) -> bool :
1659+ return False
1660+
16281661 @property
16291662 def is_global_address (self ) -> bool :
16301663 return False
@@ -1692,6 +1725,10 @@ def __init__(self, exprid: int, tag: str) -> None:
16921725 def is_ast_constant (self ) -> bool :
16931726 return True
16941727
1728+ @property
1729+ def is_constant_value_expression (self ) -> bool :
1730+ return True
1731+
16951732 def use (self ) -> List [str ]:
16961733 return []
16971734
@@ -1886,6 +1923,10 @@ def is_ast_lval_expr(self) -> bool:
18861923 def lval (self ) -> "ASTLval" :
18871924 return self ._lval
18881925
1926+ @property
1927+ def is_constant_value_expression (self ) -> bool :
1928+ return self .lval .is_constant_value_expression
1929+
18891930 def accept (self , visitor : "ASTVisitor" ) -> None :
18901931 visitor .visit_lval_expression (self )
18911932
@@ -1921,6 +1962,10 @@ def __init__(self, exprid: int, tgttyp: "ASTTyp") -> None:
19211962 def tgt_type (self ) -> "ASTTyp" :
19221963 return self ._tgttyp
19231964
1965+ @property
1966+ def is_constant_value_expression (self ) -> bool :
1967+ return True
1968+
19241969 def accept (self , visitor : "ASTVisitor" ) -> None :
19251970 visitor .visit_sizeof_expression (self )
19261971
@@ -1956,6 +2001,10 @@ def cast_tgt_type(self) -> "ASTTyp":
19562001 def cast_expr (self ) -> "ASTExpr" :
19572002 return self ._exp
19582003
2004+ @property
2005+ def is_constant_value_expression (self ) -> bool :
2006+ return self .cast_expr .is_constant_value_expression
2007+
19592008 def accept (self , visitor : "ASTVisitor" ) -> None :
19602009 visitor .visit_cast_expression (self )
19612010
@@ -2002,6 +2051,10 @@ def op(self) -> str:
20022051 def exp1 (self ) -> "ASTExpr" :
20032052 return self ._exp
20042053
2054+ @property
2055+ def is_constant_value_expression (self ) -> bool :
2056+ return self .exp1 .is_constant_value_expression
2057+
20052058 def accept (self , visitor : "ASTVisitor" ) -> None :
20062059 visitor .visit_unary_expression (self )
20072060
@@ -2058,6 +2111,12 @@ def exp1(self) -> "ASTExpr":
20582111 def exp2 (self ) -> "ASTExpr" :
20592112 return self ._exp2
20602113
2114+ @property
2115+ def is_constant_value_expression (self ) -> bool :
2116+ return (
2117+ self .exp1 .is_constant_value_expression
2118+ and self .exp2 .is_constant_value_expression )
2119+
20612120 def accept (self , visitor : "ASTVisitor" ) -> None :
20622121 visitor .visit_binary_expression (self )
20632122
@@ -2119,6 +2178,13 @@ def exp2(self) -> "ASTExpr":
21192178 def exp3 (self ) -> "ASTExpr" :
21202179 return self ._exp3
21212180
2181+ @property
2182+ def is_constant_value_expression (self ) -> bool :
2183+ return (
2184+ self .exp1 .is_constant_value_expression
2185+ and self .exp2 .is_constant_value_expression
2186+ and self .exp3 .is_constant_value_expression )
2187+
21222188 def accept (self , visitor : "ASTVisitor" ) -> None :
21232189 visitor .visit_question_expression (self )
21242190
@@ -2164,6 +2230,10 @@ def is_ast_addressof(self) -> bool:
21642230 def lval (self ) -> "ASTLval" :
21652231 return self ._lval
21662232
2233+ @property
2234+ def is_constant_value_expression (self ) -> bool :
2235+ return True
2236+
21672237 def accept (self , visitor : "ASTVisitor" ) -> None :
21682238 visitor .visit_address_of_expression (self )
21692239
@@ -2203,6 +2273,10 @@ def is_ast_startof(self) -> bool:
22032273 def lval (self ) -> "ASTLval" :
22042274 return self ._lval
22052275
2276+ @property
2277+ def is_constant_value_expression (self ) -> bool :
2278+ return True
2279+
22062280 def accept (self , visitor : "ASTVisitor" ) -> None :
22072281 visitor .visit_start_of_expression (self )
22082282
0 commit comments