@@ -37,6 +37,18 @@ class Assignment extends Expr {
3737 result = this .( AssignExpr ) .getSource ( ) or
3838 result = this .( AssignOperation ) .getRightOperand ( )
3939 }
40+
41+ /**
42+ * Holds if this assignment expression uses an overflow operator, that is,
43+ * an operator that truncates overflow rather than reporting an error.
44+ * ```
45+ * x &+= y
46+ * ```
47+ */
48+ predicate hasOverflowOperator ( ) {
49+ this .( AssignOperation ) .getOperator ( ) .getName ( ) =
50+ [ "&*=(_:_:)" , "&+=(_:_:)" , "&-=(_:_:)" , "&<<=(_:_:)" , "&>>=(_:_:)" ]
51+ }
4052}
4153
4254/**
@@ -95,10 +107,11 @@ abstract private class AssignBitwiseOperationEx extends BinaryExpr { }
95107 * An addition assignment expression:
96108 * ```
97109 * a += b
110+ * a &+= b
98111 * ```
99112 */
100113class AssignAddExpr extends AssignArithmeticOperationEx {
101- AssignAddExpr ( ) { this .getOperator ( ) .getName ( ) = "+=(_:_:)" }
114+ AssignAddExpr ( ) { this .getOperator ( ) .getName ( ) = [ "+=(_:_:)" , "&+=(_:_:)" ] }
102115
103116 override string toString ( ) { result = "... += ..." }
104117}
@@ -107,10 +120,11 @@ class AssignAddExpr extends AssignArithmeticOperationEx {
107120 * A subtraction assignment expression:
108121 * ```
109122 * a -= b
123+ * a &-= b
110124 * ```
111125 */
112126class AssignSubExpr extends AssignArithmeticOperationEx {
113- AssignSubExpr ( ) { this .getOperator ( ) .getName ( ) = "-=(_:_:)" }
127+ AssignSubExpr ( ) { this .getOperator ( ) .getName ( ) = [ "-=(_:_:)" , "&-=(_:_:)" ] }
114128
115129 override string toString ( ) { result = "... -= ..." }
116130}
@@ -119,10 +133,11 @@ class AssignSubExpr extends AssignArithmeticOperationEx {
119133 * A multiplication assignment expression:
120134 * ```
121135 * a *= b
136+ * a &*= b
122137 * ```
123138 */
124139class AssignMulExpr extends AssignArithmeticOperationEx {
125- AssignMulExpr ( ) { this .getOperator ( ) .getName ( ) = "*=(_:_:)" }
140+ AssignMulExpr ( ) { this .getOperator ( ) .getName ( ) = [ "*=(_:_:)" , "&*=(_:_:)" ] }
126141
127142 override string toString ( ) { result = "... *= ..." }
128143}
@@ -155,10 +170,11 @@ class AssignRemExpr extends AssignArithmeticOperationEx {
155170 * A left-shift assignment expression:
156171 * ```
157172 * a <<= b
173+ * a &<<= b
158174 * ```
159175 */
160176class AssignLShiftExpr extends AssignBitwiseOperationEx {
161- AssignLShiftExpr ( ) { this .getOperator ( ) .getName ( ) = "<<=(_:_:)" }
177+ AssignLShiftExpr ( ) { this .getOperator ( ) .getName ( ) = [ "<<=(_:_:)" , "&<<=(_:_:)" ] }
162178
163179 override string toString ( ) { result = "... <<= ..." }
164180}
@@ -167,10 +183,11 @@ class AssignLShiftExpr extends AssignBitwiseOperationEx {
167183 * A right-shift assignment expression:
168184 * ```
169185 * a >>= b
186+ * a &>>= b
170187 * ```
171188 */
172189class AssignRShiftExpr extends AssignBitwiseOperationEx {
173- AssignRShiftExpr ( ) { this .getOperator ( ) .getName ( ) = ">>=(_:_:)" }
190+ AssignRShiftExpr ( ) { this .getOperator ( ) .getName ( ) = [ ">>=(_:_:)" , "&>>=(_:_:)" ] }
174191
175192 override string toString ( ) { result = "... >>= ..." }
176193}
0 commit comments