diff --git a/src/Convert/Jump.hs b/src/Convert/Jump.hs index 85e64fb..3035330 100644 --- a/src/Convert/Jump.hs +++ b/src/Convert/Jump.hs @@ -41,7 +41,9 @@ convertModuleItem :: ModuleItem -> ModuleItem convertModuleItem (MIPackageItem (Function ml t f decls stmtsOrig)) = MIPackageItem $ Function ml t f decls' stmts'' where - stmts = map (traverseNestedStmts convertReturn) stmtsOrig + stmts = if t == Void + then stmtsOrig + else map (traverseNestedStmts convertReturn) stmtsOrig convertReturn :: Stmt -> Stmt convertReturn (Return Nil) = Return Nil convertReturn (Return e) = @@ -223,11 +225,12 @@ convertStmt (Break) = do assertMsg jumpAllowed "encountered break inside fork-join" modify $ \s -> s { sHasJump = True } return $ asgn jumpState jsBreak -convertStmt (Return Nil) = do +convertStmt (Return e) = do jumpAllowed <- gets sJumpAllowed returnAllowed <- gets sReturnAllowed assertMsg jumpAllowed "encountered return inside fork-join" assertMsg returnAllowed "encountered return outside of task or function" + assertMsg (e == Nil) "non-void return inside task or void function" modify $ \s -> s { sHasJump = True } return $ asgn jumpState jsReturn @@ -253,8 +256,6 @@ convertStmt (Timing timing stmt) = convertStmt (StmtAttr attr stmt) = convertStmt stmt >>= return . StmtAttr attr -convertStmt (Return{}) = return $ - error "non-void return should have been elaborated already" convertStmt (Foreach{}) = return $ error "foreach should have been elaborated already" diff --git a/test/error/return_task.sv b/test/error/return_task.sv new file mode 100644 index 0000000..3f61dba --- /dev/null +++ b/test/error/return_task.sv @@ -0,0 +1,7 @@ +// pattern: non-void return inside task or void function +module top; + task t; + return 1; + endtask + initial t; +endmodule diff --git a/test/error/return_void_func.sv b/test/error/return_void_func.sv new file mode 100644 index 0000000..57db39a --- /dev/null +++ b/test/error/return_void_func.sv @@ -0,0 +1,7 @@ +// pattern: non-void return inside task or void function +module top; + function void f; + return 1; + endfunction + initial f; +endmodule