diff --git a/py/vm.c b/py/vm.c
index 8ae619f9be8ca3864c66f448e687835e2b65a690..8a0262a8416249ad6a640fb817d5e8700b655164 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -605,8 +605,14 @@ unwind_return:
 
                     case MP_BC_RAISE_VARARGS:
                         unum = *ip++;
-                        assert(unum == 1);
-                        obj1 = POP();
+                        assert(unum <= 1);
+                        if (unum == 0) {
+                            // This assumes that nlr.ret_val holds last raised
+                            // exception and is not overwritten since then.
+                            obj1 = nlr.ret_val;
+                        } else {
+                            obj1 = POP();
+                        }
                         nlr_jump(rt_make_raise_obj(obj1));
 
                     case MP_BC_YIELD_VALUE:
diff --git a/tests/basics/try-reraise.py b/tests/basics/try-reraise.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc817fc386b846dca6b2d11c86d951aaa74c01cf
--- /dev/null
+++ b/tests/basics/try-reraise.py
@@ -0,0 +1,12 @@
+# Re-reraising last exception with raise w/o args
+
+def f():
+    try:
+        raise ValueError("val", 3)
+    except:
+        raise
+
+try:
+    f()
+except ValueError as e:
+    print(repr(e))