Browse Source

Outside of modifiers _ is a regular identifier (#1276)

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 2 năm trước cách đây
mục cha
commit
a1eae728fc

+ 6 - 11
src/sema/statements.rs

@@ -754,17 +754,12 @@ fn statement(
                     };
                 }
                 // is it an underscore modifier statement
-                pt::Expression::Variable(id) if id.name == "_" => {
-                    return if ns.functions[function_no].ty == pt::FunctionTy::Modifier {
-                        res.push(Statement::Underscore(*loc));
-                        Ok(true)
-                    } else {
-                        ns.diagnostics.push(Diagnostic::error(
-                            *loc,
-                            "underscore statement only permitted in modifiers".to_string(),
-                        ));
-                        Err(())
-                    };
+                pt::Expression::Variable(id)
+                    if id.name == "_"
+                        && ns.functions[function_no].ty == pt::FunctionTy::Modifier =>
+                {
+                    res.push(Statement::Underscore(*loc));
+                    return Ok(true);
                 }
                 pt::Expression::FunctionCall(loc, ty, args) => {
                     let ret = call_expr(

+ 1 - 1
tests/contract_testcases/substrate/modifier/declare_08.dot

@@ -2,7 +2,7 @@ strict digraph "tests/contract_testcases/substrate/modifier/declare_08.sol" {
 	contract [label="contract c\ntests/contract_testcases/substrate/modifier/declare_08.sol:2:9-6:10"]
 	bar [label="function bar\ncontract: c\ntests/contract_testcases/substrate/modifier/declare_08.sol:3:13-34\nsignature bar()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_08.sol:2:9-6:10"]
-	diagnostic_5 [label="underscore statement only permitted in modifiers\nlevel Error\ntests/contract_testcases/substrate/modifier/declare_08.sol:4:17-18"]
+	diagnostic_5 [label="'_' not found\nlevel Error\ntests/contract_testcases/substrate/modifier/declare_08.sol:4:17-18"]
 	contracts -> contract
 	contract -> bar [label="function"]
 	diagnostics -> diagnostic [label="Debug"]

+ 20 - 0
tests/contract_testcases/substrate/modifier/declare_09.dot

@@ -0,0 +1,20 @@
+strict digraph "tests/contract_testcases/substrate/modifier/declare_09.sol" {
+	contract [label="contract c\ntests/contract_testcases/substrate/modifier/declare_09.sol:1:1-6:2"]
+	bar [label="function bar\ncontract: c\ntests/contract_testcases/substrate/modifier/declare_09.sol:2:2-28\nsignature bar()\nvisibility public\nmutability pure"]
+	expr [label="expression\ntests/contract_testcases/substrate/modifier/declare_09.sol:3:3-4"]
+	internal_function [label="function() internal pure\nc._\ntests/contract_testcases/substrate/modifier/declare_09.sol:3:3-4"]
+	expr_5 [label="expression\ntests/contract_testcases/substrate/modifier/declare_09.sol:3:6-9"]
+	call_internal_function [label="call internal function\ntests/contract_testcases/substrate/modifier/declare_09.sol:3:6-9"]
+	internal_function_7 [label="function() internal pure returns (void)\nc._\ntests/contract_testcases/substrate/modifier/declare_09.sol:3:6-9"]
+	_ [label="function _\ncontract: c\ntests/contract_testcases/substrate/modifier/declare_09.sol:5:2-27\nsignature _()\nvisibility private\nmutability pure"]
+	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_09.sol:1:1-6:2"]
+	contracts -> contract
+	contract -> bar [label="function"]
+	bar -> expr [label="body"]
+	expr -> internal_function [label="expr"]
+	expr -> expr_5 [label="next"]
+	expr_5 -> call_internal_function [label="expr"]
+	call_internal_function -> internal_function_7 [label="function"]
+	contract -> _ [label="function"]
+	diagnostics -> diagnostic [label="Debug"]
+}

+ 6 - 0
tests/contract_testcases/substrate/modifier/declare_09.sol

@@ -0,0 +1,6 @@
+contract c {
+	function bar() public pure {
+		_; _();
+	}
+	function _() private pure {}
+}