From 72ab6396999d7210db18cdbd08c80a402d6baaa8 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Fri, 23 Dec 2022 19:55:44 -0700 Subject: [PATCH] forbid non-void return inside void functions --- src/Convert/Jump.hs | 9 +++++---- test/error/return_task.sv | 7 +++++++ test/error/return_void_func.sv | 7 +++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/error/return_task.sv create mode 100644 test/error/return_void_func.sv 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