Pārlūkot izejas kodu

Fix handling of new int[](count <<= 1) (#1108)

Also improves handling of any garbage passed as a size.

Fixes https://github.com/xermicus/fuzzy-sol/issues/146

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 2 gadi atpakaļ
vecāks
revīzija
5280082173

+ 12 - 4
src/sema/expression.rs

@@ -3930,9 +3930,17 @@ pub fn new(
 
     let size_ty = size_expr.ty();
 
+    if !matches!(size_ty.deref_any(), Type::Uint(_)) {
+        diagnostics.push(Diagnostic::error(
+            size_expr.loc(),
+            "new dynamic array should have an unsigned length argument".to_string(),
+        ));
+        return Err(());
+    }
+
     let size = if size_ty.deref_any().bits(ns) > 32 {
         diagnostics.push(Diagnostic::warning(
-            *loc,
+            size_expr.loc(),
             format!(
                 "conversion truncates {} to {}, as memory size is type {} on target {}",
                 size_ty.deref_any().to_string(ns),
@@ -4471,7 +4479,7 @@ fn assign_expr(
             };
             Ok(Expression::Assign(
                 *loc,
-                Type::Void,
+                var_ty.clone(),
                 Box::new(var.clone()),
                 Box::new(op(var, &var_ty, ns, diagnostics)?),
             ))
@@ -4480,7 +4488,7 @@ fn assign_expr(
             Type::Ref(r_ty) => match r_ty.as_ref() {
                 Type::Bytes(_) | Type::Int(_) | Type::Uint(_) => Ok(Expression::Assign(
                     *loc,
-                    Type::Void,
+                    *r_ty.clone(),
                     Box::new(var.clone()),
                     Box::new(op(
                         var.cast(loc, r_ty, true, ns, diagnostics)?,
@@ -4513,7 +4521,7 @@ fn assign_expr(
                 match r_ty.as_ref() {
                     Type::Bytes(_) | Type::Int(_) | Type::Uint(_) => Ok(Expression::Assign(
                         *loc,
-                        Type::Void,
+                        *r_ty.clone(),
                         Box::new(var.clone()),
                         Box::new(op(
                             var.cast(loc, r_ty, true, ns, diagnostics)?,

+ 9 - 9
tests/contract_testcases/evm/rubixi.dot

@@ -38,7 +38,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	builtins_38 [label="builtin Value\ntests/contract_testcases/evm/rubixi.sol:40:22-31"]
 	number_literal_39 [label="uint128 literal: 1000000000000000000\ntests/contract_testcases/evm/rubixi.sol:40:34-41"]
 	expr_40 [label="expression\ntests/contract_testcases/evm/rubixi.sol:41:26-52"]
-	assign_41 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:41:26-52"]
+	assign_41 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:41:26-52"]
 	storage_var_42 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:41:26-39"]
 	add [label="add\nuint256\ntests/contract_testcases/evm/rubixi.sol:41:26-52"]
 	storage_load_44 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:41:26-52"]
@@ -55,7 +55,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	builtins_55 [label="builtin Value\ntests/contract_testcases/evm/rubixi.sol:47:22-31"]
 	number_literal_56 [label="uint128 literal: 50000000000000000000\ntests/contract_testcases/evm/rubixi.sol:47:35-43"]
 	expr_57 [label="expression\ntests/contract_testcases/evm/rubixi.sol:47:45-54"]
-	assign_58 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:47:45-54"]
+	assign_58 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:47:45-54"]
 	variable [label="variable: _fee\nuint256\ntests/contract_testcases/evm/rubixi.sol:47:45-49"]
 	divide [label="divide\nuint256\ntests/contract_testcases/evm/rubixi.sol:47:45-54"]
 	variable_61 [label="variable: _fee\nuint256\ntests/contract_testcases/evm/rubixi.sol:47:45-49"]
@@ -98,7 +98,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	storage_var_98 [label="storage variable\nRubixi.pyramidMultiplier\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:59:54-71"]
 	number_literal_99 [label="uint256 literal: 150\ntests/contract_testcases/evm/rubixi.sol:59:74-77"]
 	expr_100 [label="expression\ntests/contract_testcases/evm/rubixi.sol:62:18-61"]
-	assign_101 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:62:18-61"]
+	assign_101 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:62:18-61"]
 	storage_var_102 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:62:18-25"]
 	add_103 [label="add\nuint256\ntests/contract_testcases/evm/rubixi.sol:62:18-61"]
 	storage_load_104 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:62:18-61"]
@@ -112,7 +112,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	variable_112 [label="variable: _fee\nuint256\ntests/contract_testcases/evm/rubixi.sol:62:49-53"]
 	number_literal_113 [label="uint256 literal: 100\ntests/contract_testcases/evm/rubixi.sol:62:58-61"]
 	expr_114 [label="expression\ntests/contract_testcases/evm/rubixi.sol:63:18-59"]
-	assign_115 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:63:18-59"]
+	assign_115 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:63:18-59"]
 	storage_var_116 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:63:18-31"]
 	add_117 [label="add\nuint256\ntests/contract_testcases/evm/rubixi.sol:63:18-59"]
 	storage_load_118 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:63:18-59"]
@@ -141,7 +141,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	storage_load_141 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:67:59-70"]
 	storage_var_142 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:67:59-70"]
 	expr_143 [label="expression\ntests/contract_testcases/evm/rubixi.sol:70:26-69"]
-	assign_144 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:70:26-69"]
+	assign_144 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:70:26-69"]
 	storage_var_145 [label="storage variable\nRubixi.balance\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:70:26-33"]
 	subtract_146 [label="subtract\nuint256\ntests/contract_testcases/evm/rubixi.sol:70:26-69"]
 	storage_load_147 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:70:26-69"]
@@ -153,7 +153,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	storage_load_153 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:70:50-61"]
 	storage_var_154 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:70:50-61"]
 	expr_155 [label="expression\ntests/contract_testcases/evm/rubixi.sol:71:26-42"]
-	assign_156 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:71:26-42"]
+	assign_156 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:71:26-42"]
 	storage_var_157 [label="storage variable\nRubixi.payoutOrder\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:71:26-37"]
 	add_158 [label="add\nuint256\ntests/contract_testcases/evm/rubixi.sol:71:26-42"]
 	storage_load_159 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:71:26-42"]
@@ -183,7 +183,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	collectFeesInEther [label="function collectFeesInEther\ncontract: Rubixi\ntests/contract_testcases/evm/rubixi.sol:83:10-65\nsignature collectFeesInEther(uint256)\nvisibility public\nmutability nonpayable"]
 	parameters_184 [label="parameters\nuint256 _amt"]
 	expr_185 [label="expression\ntests/contract_testcases/evm/rubixi.sol:84:18-33"]
-	assign_186 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:84:18-33"]
+	assign_186 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:84:18-33"]
 	variable_187 [label="variable: _amt\nuint256\ntests/contract_testcases/evm/rubixi.sol:84:18-22"]
 	multiply_188 [label="multiply\nuint256\ntests/contract_testcases/evm/rubixi.sol:84:18-33"]
 	variable_189 [label="variable: _amt\nuint256\ntests/contract_testcases/evm/rubixi.sol:84:18-22"]
@@ -212,7 +212,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	trunc_212 [label="truncate uint128\ntests/contract_testcases/evm/rubixi.sol:89:44-57"]
 	variable_213 [label="variable: _amt\nuint256\ntests/contract_testcases/evm/rubixi.sol:89:52-56"]
 	expr_214 [label="expression\ntests/contract_testcases/evm/rubixi.sol:90:18-39"]
-	assign_215 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:90:18-39"]
+	assign_215 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:90:18-39"]
 	storage_var_216 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:90:18-31"]
 	subtract_217 [label="subtract\nuint256\ntests/contract_testcases/evm/rubixi.sol:90:18-39"]
 	storage_load_218 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:90:18-39"]
@@ -247,7 +247,7 @@ strict digraph "tests/contract_testcases/evm/rubixi.sol" {
 	trunc_247 [label="truncate uint128\ntests/contract_testcases/evm/rubixi.sol:97:44-66"]
 	variable_248 [label="variable: feesToCollect\nuint256\ntests/contract_testcases/evm/rubixi.sol:97:52-65"]
 	expr_249 [label="expression\ntests/contract_testcases/evm/rubixi.sol:98:18-48"]
-	assign_250 [label="assign\nvoid\ntests/contract_testcases/evm/rubixi.sol:98:18-48"]
+	assign_250 [label="assign\nuint256\ntests/contract_testcases/evm/rubixi.sol:98:18-48"]
 	storage_var_251 [label="storage variable\nRubixi.collectedFees\nuint256 storage\ntests/contract_testcases/evm/rubixi.sol:98:18-31"]
 	subtract_252 [label="subtract\nuint256\ntests/contract_testcases/evm/rubixi.sol:98:18-48"]
 	storage_load_253 [label="storage load uint256\ntests/contract_testcases/evm/rubixi.sol:98:18-48"]

+ 1 - 1
tests/contract_testcases/solana/address_member_call.dot

@@ -26,7 +26,7 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	post_increment [label="post increment\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-53"]
 	variable_27 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-51"]
 	expr_28 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
-	assign [label="assign\nvoid\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
+	assign [label="assign\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
 	variable_30 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
 	add [label="add\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
 	variable_32 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]

+ 1 - 1
tests/contract_testcases/solana/destructure_assign_struct_member_2.dot

@@ -33,7 +33,7 @@ strict digraph "tests/contract_testcases/solana/destructure_assign_struct_member
 	diagnostic_34 [label="found interface 'IUniswapV2Pair'\nlevel Debug\ntests/contract_testcases/solana/destructure_assign_struct_member_2.sol:4:1-6:2"]
 	diagnostic_35 [label="found contract 'Contract'\nlevel Debug\ntests/contract_testcases/solana/destructure_assign_struct_member_2.sol:9:1-25:2"]
 	diagnostic_36 [label="local variable 'struct_1' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/destructure_assign_struct_member_2.sol:20:26-34"]
-	diagnostic_37 [label="conversion truncates uint256 to uint32, as memory size is type uint32 on target solana\nlevel Warning\ntests/contract_testcases/solana/destructure_assign_struct_member_2.sol:20:37-56"]
+	diagnostic_37 [label="conversion truncates uint256 to uint32, as memory size is type uint32 on target solana\nlevel Warning\ntests/contract_testcases/solana/destructure_assign_struct_member_2.sol:20:51-55"]
 	structs -> Struct1
 	contracts -> contract
 	contract -> getReserves [label="function"]

+ 1 - 1
tests/contract_testcases/solana/functions/override.dot

@@ -3,7 +3,7 @@ strict digraph "tests/contract_testcases/solana/functions/override.sol" {
 	inc [label="function inc\ntests/contract_testcases/solana/functions/../simple.sol:7:1-23\nsignature inc((int64,bool))\nvisibility internal\nmutability pure"]
 	parameters [label="parameters\nstruct S s"]
 	expr [label="expression\ntests/contract_testcases/solana/functions/../simple.sol:7:26-35"]
-	assign [label="assign\nvoid\ntests/contract_testcases/solana/functions/../simple.sol:7:26-35"]
+	assign [label="assign\nint64\ntests/contract_testcases/solana/functions/../simple.sol:7:26-35"]
 	structmember [label="struct member #0 int64\ntests/contract_testcases/solana/functions/../simple.sol:7:28-30"]
 	variable [label="variable: s\nstruct S\ntests/contract_testcases/solana/functions/../simple.sol:7:26-27"]
 	add [label="add\nint64\ntests/contract_testcases/solana/functions/../simple.sol:7:26-35"]

+ 1 - 1
tests/contract_testcases/solana/import_contracts_via_object.dot

@@ -3,7 +3,7 @@ strict digraph "tests/contract_testcases/solana/import_contracts_via_object.sol"
 	inc [label="function inc\ntests/contract_testcases/solana/simple.sol:7:1-23\nsignature inc((int64,bool))\nvisibility internal\nmutability pure"]
 	parameters [label="parameters\nstruct S s"]
 	expr [label="expression\ntests/contract_testcases/solana/simple.sol:7:26-35"]
-	assign [label="assign\nvoid\ntests/contract_testcases/solana/simple.sol:7:26-35"]
+	assign [label="assign\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]
 	structmember [label="struct member #0 int64\ntests/contract_testcases/solana/simple.sol:7:28-30"]
 	variable [label="variable: s\nstruct S\ntests/contract_testcases/solana/simple.sol:7:26-27"]
 	add [label="add\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]

+ 1 - 1
tests/contract_testcases/solana/mapping_deletion.dot

@@ -11,7 +11,7 @@ strict digraph "tests/contract_testcases/solana/mapping_deletion.sol" {
 	increment [label="function increment\ncontract: savedTest\ntests/contract_testcases/solana/mapping_deletion.sol:7:5-38\nsignature increment(uint256)\nvisibility public\nmutability nonpayable"]
 	parameters_12 [label="parameters\nuint256 f"]
 	expr_13 [label="expression\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-15"]
-	assign_14 [label="assign\nvoid\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-15"]
+	assign_14 [label="assign\nuint256\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-15"]
 	storage_var_15 [label="storage variable\nsavedTest.b\nuint256 storage\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-10"]
 	add [label="add\nuint256\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-15"]
 	storage_load [label="storage load uint256\ntests/contract_testcases/solana/mapping_deletion.sol:8:9-15"]

+ 1 - 1
tests/contract_testcases/solana/simple.dot

@@ -3,7 +3,7 @@ strict digraph "tests/contract_testcases/solana/simple.sol" {
 	inc [label="function inc\ntests/contract_testcases/solana/simple.sol:7:1-23\nsignature inc((int64,bool))\nvisibility internal\nmutability pure"]
 	parameters [label="parameters\nstruct S s"]
 	expr [label="expression\ntests/contract_testcases/solana/simple.sol:7:26-35"]
-	assign [label="assign\nvoid\ntests/contract_testcases/solana/simple.sol:7:26-35"]
+	assign [label="assign\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]
 	structmember [label="struct member #0 int64\ntests/contract_testcases/solana/simple.sol:7:28-30"]
 	variable [label="variable: s\nstruct S\ntests/contract_testcases/solana/simple.sol:7:26-27"]
 	add [label="add\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]

+ 2 - 2
tests/contract_testcases/solana/using_import.dot

@@ -3,7 +3,7 @@ strict digraph "tests/contract_testcases/solana/using_import.sol" {
 	inc [label="function inc\ntests/contract_testcases/solana/simple.sol:7:1-23\nsignature inc((int64,bool))\nvisibility internal\nmutability pure"]
 	parameters [label="parameters\nstruct S s"]
 	expr [label="expression\ntests/contract_testcases/solana/simple.sol:7:26-35"]
-	assign [label="assign\nvoid\ntests/contract_testcases/solana/simple.sol:7:26-35"]
+	assign [label="assign\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]
 	structmember [label="struct member #0 int64\ntests/contract_testcases/solana/simple.sol:7:28-30"]
 	variable [label="variable: s\nstruct S\ntests/contract_testcases/solana/simple.sol:7:26-27"]
 	add [label="add\nint64\ntests/contract_testcases/solana/simple.sol:7:26-35"]
@@ -14,7 +14,7 @@ strict digraph "tests/contract_testcases/solana/using_import.sol" {
 	dec [label="function dec\ntests/contract_testcases/solana/using_import.sol:3:1-31\nsignature dec((int64,bool))\nvisibility internal\nmutability pure"]
 	parameters_15 [label="parameters\nstruct S s"]
 	expr_16 [label="expression\ntests/contract_testcases/solana/using_import.sol:3:34-43"]
-	assign_17 [label="assign\nvoid\ntests/contract_testcases/solana/using_import.sol:3:34-43"]
+	assign_17 [label="assign\nint64\ntests/contract_testcases/solana/using_import.sol:3:34-43"]
 	structmember_18 [label="struct member #0 int64\ntests/contract_testcases/solana/using_import.sol:3:36-38"]
 	variable_19 [label="variable: s\nstruct S\ntests/contract_testcases/solana/using_import.sol:3:34-35"]
 	subtract [label="subtract\nint64\ntests/contract_testcases/solana/using_import.sol:3:34-43"]

+ 1 - 1
tests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.dot

@@ -2,7 +2,7 @@ strict digraph "tests/contract_testcases/substrate/arrays/memory_dynamic_array_n
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.sol:2:9-8:10"]
 	test [label="function test\ncontract: foo\ntests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.sol:2:9-8:10"]
-	diagnostic_5 [label="implicit conversion to uint32 from bytes1 not allowed\nlevel Error\ntests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.sol:4:48-55"]
+	diagnostic_5 [label="new dynamic array should have an unsigned length argument\nlevel Error\ntests/contract_testcases/substrate/arrays/memory_dynamic_array_new_02.sol:4:48-55"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]

+ 62 - 0
tests/contract_testcases/substrate/expressions/bad_new_args.dot

@@ -0,0 +1,62 @@
+strict digraph "tests/contract_testcases/substrate/expressions/bad_new_args.sol" {
+	contract [label="contract c\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:1:1-14:2"]
+	var [label="variable state\nvisibility internal\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:2:2-14"]
+	f [label="function f\ncontract: c\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:4:2-33\nsignature f(uint32)\nvisibility public\nmutability nonpayable"]
+	parameters [label="parameters\nuint32 count"]
+	var_decl [label="variable decl uint256[] array\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:3-48"]
+	alloc_array [label="alloc array uint256[]\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:25-48"]
+	assign [label="assign\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:36-47"]
+	variable [label="variable: count\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:36-41"]
+	shift_left [label="shift left\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:36-47"]
+	variable_10 [label="variable: count\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:36-41"]
+	zero_ext [label="zero extend uint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:36-47"]
+	number_literal [label="uint8 literal: 1\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:46-47"]
+	g [label="function g\ncontract: c\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:7:2-21\nsignature g()\nvisibility public\nmutability nonpayable"]
+	var_decl_14 [label="variable decl uint256[] array\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:3-48"]
+	alloc_array_15 [label="alloc array uint256[]\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:25-48"]
+	assign_16 [label="assign\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-47"]
+	storage_var [label="storage variable\nc.state\nuint32 storage\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-41"]
+	shift_left_18 [label="shift left\nuint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-47"]
+	storage_load [label="storage load uint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-47"]
+	storage_var_20 [label="storage variable\nc.state\nuint32 storage\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-41"]
+	zero_ext_21 [label="zero extend uint32\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:36-47"]
+	number_literal_22 [label="uint8 literal: 1\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:46-47"]
+	h [label="function h\ncontract: c\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:10:2-33\nsignature h(uint32)\nvisibility public\nmutability nonpayable"]
+	parameters_24 [label="parameters\nuint32 count"]
+	i [label="function i\ncontract: c\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:13:2-21\nsignature i()\nvisibility public\nmutability nonpayable"]
+	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:1:1-14:2"]
+	diagnostic_28 [label="function parameter 'count' has never been read\nlevel Warning\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:4:20-25"]
+	diagnostic_29 [label="local variable 'array' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:5:17-22"]
+	diagnostic_30 [label="local variable 'array' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:8:17-22"]
+	diagnostic_31 [label="new dynamic array should have an unsigned length argument\nlevel Error\ntests/contract_testcases/substrate/expressions/bad_new_args.sol:11:36-39"]
+	contracts -> contract
+	contract -> var [label="variable"]
+	contract -> f [label="function"]
+	f -> parameters [label="parameters"]
+	f -> var_decl [label="body"]
+	var_decl -> alloc_array [label="init"]
+	alloc_array -> assign [label="length"]
+	assign -> variable [label="left"]
+	assign -> shift_left [label="right"]
+	shift_left -> variable_10 [label="left"]
+	shift_left -> zero_ext [label="right"]
+	zero_ext -> number_literal [label="expr"]
+	contract -> g [label="function"]
+	g -> var_decl_14 [label="body"]
+	var_decl_14 -> alloc_array_15 [label="init"]
+	alloc_array_15 -> assign_16 [label="length"]
+	assign_16 -> storage_var [label="left"]
+	assign_16 -> shift_left_18 [label="right"]
+	shift_left_18 -> storage_load [label="left"]
+	storage_load -> storage_var_20 [label="expr"]
+	shift_left_18 -> zero_ext_21 [label="right"]
+	zero_ext_21 -> number_literal_22 [label="expr"]
+	contract -> h [label="function"]
+	h -> parameters_24 [label="parameters"]
+	contract -> i [label="function"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_28 [label="Warning"]
+	diagnostics -> diagnostic_29 [label="Warning"]
+	diagnostics -> diagnostic_30 [label="Warning"]
+	diagnostics -> diagnostic_31 [label="Error"]
+}

+ 14 - 0
tests/contract_testcases/substrate/expressions/bad_new_args.sol

@@ -0,0 +1,14 @@
+contract c {
+	uint32 state;
+
+	function f(uint32 count) public {
+		uint[] memory array = new uint[](count <<= 1);
+	}
+	function g() public {
+		uint[] memory array = new uint[](state <<= 1);
+	}
+	function h(uint32 count) public {
+		uint[] memory array = new uint[](i());
+	}
+	function i() public {}
+}