Add class name in the error msg about calling 'new' on virtual class (#4739)

This commit is contained in:
Ryszard Rozak 2023-12-05 16:31:59 +01:00 committed by GitHub
parent ea2084392f
commit ca5a7d7656
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 4 deletions

View File

@ -3840,8 +3840,9 @@ class WidthVisitor final : public VNVisitor {
classp->v3fatalSrc("Can't find class's new");
}
if (classp->isVirtual() || classp->isInterfaceClass()) {
nodep->v3error(
"Illegal to call 'new' using an abstract virtual class (IEEE 1800-2017 8.21)");
nodep->v3error("Illegal to call 'new' using an abstract virtual class "
+ AstNode::prettyNameQ(classp->origName())
+ " (IEEE 1800-2017 8.21)");
}
} else { // super.new case
// in this case class and taskp() should be properly linked in V3LinkDot.cpp during

View File

@ -0,0 +1,9 @@
%Error: t/t_class_param_virtual_bad.v:13:11: Illegal to call 'new' using an abstract virtual class 'VBase' (IEEE 1800-2017 8.21)
: ... note: In instance 't'
13 | t = new;
| ^~~
%Error: t/t_class_param_virtual_bad.v:23:28: Illegal to call 'new' using an abstract virtual class 'ClsVirt' (IEEE 1800-2017 8.21)
: ... note: In instance 't'
23 | ClsVirt#(VBase) cv = new;
| ^~~
%Error: Exiting due to

View File

@ -0,0 +1,19 @@
#!/usr/bin/env perl
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2020 by Wilson Snyder. 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-License-Identifier: LGPL-3.0-only OR Artistic-2.0
scenarios(vlt => 1);
lint(
fails => 1,
expect_filename => $Self->{golden_filename},
);
ok(1);
1;

View File

@ -0,0 +1,26 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2023 by Antmicro Ltd.
// SPDX-License-Identifier: CC0-1.0
virtual class VBase;
endclass
class Cls#(parameter type T = VBase);
T t;
function new;
t = new;
endfunction
endclass
virtual class ClsVirt#(parameter type T);
endclass
module t;
initial begin
Cls c = new; // Error
ClsVirt#(VBase) cv = new; // Error
$stop;
end
endmodule

View File

@ -1,4 +1,4 @@
%Error: t/t_class_virtual_bad.v:12:17: Illegal to call 'new' using an abstract virtual class (IEEE 1800-2017 8.21)
%Error: t/t_class_virtual_bad.v:12:17: Illegal to call 'new' using an abstract virtual class 'VBase' (IEEE 1800-2017 8.21)
: ... note: In instance 't'
12 | VBase b = new;
| ^~~

View File

@ -1,4 +1,4 @@
%Error: t/t_implements_new_bad.v:13:11: Illegal to call 'new' using an abstract virtual class (IEEE 1800-2017 8.21)
%Error: t/t_implements_new_bad.v:13:11: Illegal to call 'new' using an abstract virtual class 'Icls' (IEEE 1800-2017 8.21)
: ... note: In instance 't'
13 | c = new;
| ^~~