From 012b647833da87602c1f434c344ad694fc9d2876 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 12 Sep 2026 08:32:53 -0400 Subject: [PATCH] Fix marking inherited virtual functions --- src/V3Task.cpp | 4 ---- src/V3Width.cpp | 2 ++ test_regress/t/t_class_static_virtual_method_bad.out | 1 - test_regress/t/t_timing_at_dtype_bad.v | 5 ++++- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/V3Task.cpp b/src/V3Task.cpp index 7ef30f56a..25cd9093d 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -1753,10 +1753,6 @@ class TaskVisitor final : public VNVisitor { << nodep->prettyNameQ()); } - if (nodep->isStatic() && nodep->isVirtual()) { - nodep->v3error("Static methods cannot be virtual"); - } - const bool noInline = m_statep->ftaskNoInline(nodep); const bool needsNonInlineCFunc = m_statep->ftaskNeedsNonInlineCFunc(nodep); // Warn if not inlining an impure ftask (unless method, recursive, diff --git a/src/V3Width.cpp b/src/V3Width.cpp index dc8b1d95e..c620f9937 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -7234,6 +7234,8 @@ class WidthVisitor final : public VNVisitor { nodep->v3error("The 'constraint_mode' method is built-in and cannot be overridden" " (IEEE 1800-2023 18.9)"); } + if (nodep->isStatic() && nodep->isVirtual()) + nodep->v3error("Static methods cannot be virtual"); if (nodep->classMethod() && nodep->name() == "new") { if (nodep->isVirtual()) nodep->v3error("class 'new()' cannot be virual (IEEE 1800-2023 18.3)"); diff --git a/test_regress/t/t_class_static_virtual_method_bad.out b/test_regress/t/t_class_static_virtual_method_bad.out index 47d7ad7c1..f7ad4b0c1 100644 --- a/test_regress/t/t_class_static_virtual_method_bad.out +++ b/test_regress/t/t_class_static_virtual_method_bad.out @@ -1,5 +1,4 @@ %Error: t/t_class_static_virtual_method_bad.v:8:23: Static methods cannot be virtual - : ... note: In instance '$unit.Foo' 8 | static virtual task foo(); | ^~~ ... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance. diff --git a/test_regress/t/t_timing_at_dtype_bad.v b/test_regress/t/t_timing_at_dtype_bad.v index 72af27a0f..5737a4187 100644 --- a/test_regress/t/t_timing_at_dtype_bad.v +++ b/test_regress/t/t_timing_at_dtype_bad.v @@ -31,6 +31,9 @@ module t; any_monitor #(q_t, q_t) imon; - initial $stop; + initial begin + imon.run_phase(); + $stop; + end endmodule