From 6902c3ade5ade61f9ae82b2383f2d7ed2efe9a4b Mon Sep 17 00:00:00 2001 From: Igor Zaworski Date: Mon, 6 Jul 2026 17:43:53 +0200 Subject: [PATCH] [#99211] Static virtual ftasks detection Signed-off-by: Igor Zaworski --- src/V3Task.cpp | 4 ++++ .../t/t_class_static_virtual_method_bad.out | 6 ++++++ .../t/t_class_static_virtual_method_bad.py | 16 ++++++++++++++++ .../t/t_class_static_virtual_method_bad.v | 9 +++++++++ 4 files changed, 35 insertions(+) create mode 100644 test_regress/t/t_class_static_virtual_method_bad.out create mode 100755 test_regress/t/t_class_static_virtual_method_bad.py create mode 100644 test_regress/t/t_class_static_virtual_method_bad.v diff --git a/src/V3Task.cpp b/src/V3Task.cpp index 28768e305..2c3d7c99c 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -1740,6 +1740,10 @@ 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/test_regress/t/t_class_static_virtual_method_bad.out b/test_regress/t/t_class_static_virtual_method_bad.out new file mode 100644 index 000000000..54053fcd0 --- /dev/null +++ b/test_regress/t/t_class_static_virtual_method_bad.out @@ -0,0 +1,6 @@ +%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(); endtask + | ^~~ + ... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance. +%Error: Exiting due to diff --git a/test_regress/t/t_class_static_virtual_method_bad.py b/test_regress/t/t_class_static_virtual_method_bad.py new file mode 100755 index 000000000..38cf36b43 --- /dev/null +++ b/test_regress/t/t_class_static_virtual_method_bad.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of either the GNU Lesser General Public License Version 3 +# or the Perl Artistic License Version 2.0. +# SPDX-FileCopyrightText: 2026 Wilson Snyder +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +import vltest_bootstrap + +test.scenarios('linter') + +test.lint(fails=True, expect_filename=test.golden_filename) + +test.passes() diff --git a/test_regress/t/t_class_static_virtual_method_bad.v b/test_regress/t/t_class_static_virtual_method_bad.v new file mode 100644 index 000000000..9338e0f63 --- /dev/null +++ b/test_regress/t/t_class_static_virtual_method_bad.v @@ -0,0 +1,9 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain. +// SPDX-FileCopyrightText: 2026 Antmicro +// SPDX-License-Identifier: CC0-1.0 + +class Foo; + static virtual task foo(); endtask +endclass