Standardize some error messages.

This commit is contained in:
Wilson Snyder 2025-03-23 19:51:54 -04:00
parent 464e19caaa
commit 7521c2c644
40 changed files with 137 additions and 90 deletions

View File

@ -295,7 +295,7 @@ private:
popp->makeStmt()}); popp->makeStmt()});
} }
} else { } else {
nodep->v3fatal("Invalid direction"); nodep->v3fatalSrc("Invalid direction");
} }
VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep);
} }

View File

@ -1340,7 +1340,7 @@ void AstNode::dumpTreeFile(const string& filename, bool doDump) {
{ // Write log & close { // Write log & close
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> logsp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logsp{V3File::new_ofstream(filename)};
if (logsp->fail()) v3fatal("Can't write " << filename); if (logsp->fail()) v3fatal("Can't write file: " << filename);
*logsp << "Verilator Tree Dump (format 0x3900) from <e" << std::dec << editCountLast(); *logsp << "Verilator Tree Dump (format 0x3900) from <e" << std::dec << editCountLast();
*logsp << "> to <e" << std::dec << editCountGbl() << ">\n"; *logsp << "> to <e" << std::dec << editCountGbl() << ">\n";
if (editCountGbl() == editCountLast() && ::dumpTreeLevel() < 9) { if (editCountGbl() == editCountLast() && ::dumpTreeLevel() < 9) {
@ -1385,7 +1385,7 @@ void AstNode::dumpTreeJsonFile(const string& filename, bool doDump) {
if (!doDump) return; if (!doDump) return;
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
if (treejsonp->fail()) v3fatal("Can't write " << filename); if (treejsonp->fail()) v3fatal("Can't write file: " << filename);
dumpTreeJson(*treejsonp); dumpTreeJson(*treejsonp);
*treejsonp << '\n'; *treejsonp << '\n';
} }
@ -1394,7 +1394,7 @@ void AstNode::dumpJsonMetaFileGdb(const char* filename) { dumpJsonMetaFile(filen
void AstNode::dumpJsonMetaFile(const string& filename) { void AstNode::dumpJsonMetaFile(const string& filename) {
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
if (treejsonp->fail()) v3fatalStatic("Can't write " << filename); if (treejsonp->fail()) v3fatalStatic("Can't write file: " << filename);
*treejsonp << '{'; *treejsonp << '{';
FileLine::fileNameNumMapDumpJson(*treejsonp); FileLine::fileNameNumMapDumpJson(*treejsonp);
*treejsonp << ','; *treejsonp << ',';
@ -1408,7 +1408,7 @@ void AstNode::dumpTreeDotFile(const string& filename, bool doDump) {
if (doDump) { if (doDump) {
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> treedotp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> treedotp{V3File::new_ofstream(filename)};
if (treedotp->fail()) v3fatal("Can't write " << filename); if (treedotp->fail()) v3fatal("Can't write file: " << filename);
*treedotp << "digraph vTree{\n"; *treedotp << "digraph vTree{\n";
*treedotp << "\tgraph\t[label=\"" << filename + ".dot" *treedotp << "\tgraph\t[label=\"" << filename + ".dot"
<< "\",\n"; << "\",\n";

View File

@ -193,7 +193,7 @@ void DfgGraph::dumpDotFile(const string& filename, const string& label) const {
// This generates a file used by graphviz, https://www.graphviz.org // This generates a file used by graphviz, https://www.graphviz.org
// "hardcoded" parameters: // "hardcoded" parameters:
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(filename)};
if (os->fail()) v3fatal("Cannot write to file: " << filename); if (os->fail()) v3fatal("Can't write file: " << filename);
dumpDot(*os.get(), label); dumpDot(*os.get(), label);
os->close(); os->close();
} }
@ -244,7 +244,7 @@ void DfgGraph::dumpDotUpstreamCone(const string& fileName, const DfgVertex& vtx,
const string& name) const { const string& name) const {
// Open output file // Open output file
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)}; const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
if (os->fail()) v3fatal("Cannot write to file: " << fileName); if (os->fail()) v3fatal("Can't write file: " << fileName);
// Header // Header
*os << "digraph dfg {\n"; *os << "digraph dfg {\n";
@ -278,7 +278,7 @@ void DfgGraph::dumpDotAllVarConesPrefixed(const string& label) const {
const string coneName{prefix + sinkp->varp()->name()}; const string coneName{prefix + sinkp->varp()->name()};
const string fileName{v3Global.debugFilename(coneName) + ".dot"}; const string fileName{v3Global.debugFilename(coneName) + ".dot"};
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)}; const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
if (os->fail()) v3fatal("Cannot write to file: " << fileName); if (os->fail()) v3fatal("Can't write file: " << fileName);
// Header // Header
*os << "digraph dfg {\n"; *os << "digraph dfg {\n";

View File

@ -199,7 +199,7 @@ class DfgToAstVisitor final : DfgVisitor {
// VISITORS // VISITORS
void visit(DfgVertex* vtxp) override { // LCOV_EXCL_START void visit(DfgVertex* vtxp) override { // LCOV_EXCL_START
vtxp->v3fatal("Unhandled DfgVertex: " << vtxp->typeName()); vtxp->v3fatalSrc("Unhandled DfgVertex: " << vtxp->typeName());
} // LCOV_EXCL_STOP } // LCOV_EXCL_STOP
void visit(DfgVarPacked* vtxp) override { void visit(DfgVarPacked* vtxp) override {

View File

@ -85,7 +85,7 @@ V3DfgOptimizationContext::~V3DfgOptimizationContext() {
+ "__stats_dfg_patterns__" + ident + ".txt"; + "__stats_dfg_patterns__" + ident + ".txt";
// Open, write, close // Open, write, close
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
if (ofp->fail()) v3fatal("Can't write " << filename); if (ofp->fail()) v3fatal("Can't write file: " << filename);
m_patternStats.dump(m_label, *ofp); m_patternStats.dump(m_label, *ofp);
} }

View File

@ -55,7 +55,7 @@ V3DupFinder::iterator V3DupFinder::findDuplicate(AstNode* nodep, V3DupFinderUser
void V3DupFinder::dumpFile(const string& filename, bool tree) { void V3DupFinder::dumpFile(const string& filename, bool tree) {
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
std::unordered_map<int, int> dist; std::unordered_map<int, int> dist;

View File

@ -95,7 +95,7 @@ protected:
} }
void visit(AstInitItem* nodep) override { // LCOV_EXCL_START void visit(AstInitItem* nodep) override { // LCOV_EXCL_START
nodep->v3fatal("Handled by AstInitArray"); nodep->v3fatalSrc("Handled by AstInitArray");
} // LCOV_EXCL_STOP } // LCOV_EXCL_STOP
void visit(AstConst* nodep) override { void visit(AstConst* nodep) override {

View File

@ -408,7 +408,7 @@ private:
const string filename = v3Global.debugFilename("outputgroup") + ".txt"; const string filename = v3Global.debugFilename("outputgroup") + ".txt";
UINFO(5, "Dumping " << filename << endl); UINFO(5, "Dumping " << filename << endl);
m_logp = std::unique_ptr<std::ofstream>{V3File::new_ofstream(filename)}; m_logp = std::unique_ptr<std::ofstream>{V3File::new_ofstream(filename)};
if (m_logp->fail()) v3fatal("Can't write " << filename); if (m_logp->fail()) v3fatal("Can't write file: " << filename);
} }
if (m_logp) dumpLogScoreHistogram(*m_logp); if (m_logp) dumpLogScoreHistogram(*m_logp);

View File

@ -98,7 +98,7 @@ private:
void dumpDotFile(const V3Graph& graph, const string& filename) const { void dumpDotFile(const V3Graph& graph, const string& filename) const {
// This generates a file used by graphviz, https://www.graphviz.org // This generates a file used by graphviz, https://www.graphviz.org
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
// Header // Header
*logp << "digraph v3graph {\n"; *logp << "digraph v3graph {\n";

View File

@ -146,7 +146,7 @@ V3FileDependImp dependImp; // Depend implementation class
void V3FileDependImp::writeDepend(const string& filename) { void V3FileDependImp::writeDepend(const string& filename) {
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
if (ofp->fail()) v3fatal("Can't write " << filename); if (ofp->fail()) v3fatal("Can't write file: " << filename);
for (const DependFile& i : m_filenameList) { for (const DependFile& i : m_filenameList) {
if (i.target()) *ofp << i.filename() << " "; if (i.target()) *ofp << i.filename() << " ";
@ -179,7 +179,7 @@ std::vector<string> V3FileDependImp::getAllDeps() const {
void V3FileDependImp::writeTimes(const string& filename, const string& cmdlineIn) { void V3FileDependImp::writeTimes(const string& filename, const string& cmdlineIn) {
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
if (ofp->fail()) v3fatal("Can't write " << filename); if (ofp->fail()) v3fatal("Can't write file: " << filename);
const string cmdline = stripQuotes(cmdlineIn); const string cmdline = stripQuotes(cmdlineIn);
*ofp << "# DESCR" *ofp << "# DESCR"
@ -936,7 +936,7 @@ V3OutFile::V3OutFile(const string& filename, V3OutFormatter::Language lang)
: V3OutFormatter{filename, lang} : V3OutFormatter{filename, lang}
, m_bufferp{new std::array<char, WRITE_BUFFER_SIZE_BYTES>{}} { , m_bufferp{new std::array<char, WRITE_BUFFER_SIZE_BYTES>{}} {
if ((m_fp = V3File::new_fopen_w(filename)) == nullptr) { if ((m_fp = V3File::new_fopen_w(filename)) == nullptr) {
v3fatal("Cannot write " << filename); v3fatal("Can't write file: " << filename);
} }
} }

View File

@ -284,7 +284,7 @@ void V3Graph::dumpDotFile(const string& filename, bool colorAsSubgraph) const {
// This generates a file used by graphviz, https://www.graphviz.org // This generates a file used by graphviz, https://www.graphviz.org
// "hardcoded" parameters: // "hardcoded" parameters:
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
// Header // Header
*logp << "digraph v3graph {\n"; *logp << "digraph v3graph {\n";

View File

@ -603,10 +603,10 @@ class InlineVisitor final : public VNVisitor {
//-------------------- //--------------------
void visit(AstCell* nodep) override { // LCOV_EXCL_START void visit(AstCell* nodep) override { // LCOV_EXCL_START
nodep->v3fatal("Traversal should have been short circuited"); nodep->v3fatalSrc("Traversal should have been short circuited");
} }
void visit(AstNodeStmt* nodep) override { void visit(AstNodeStmt* nodep) override {
nodep->v3fatal("Traversal should have been short circuited"); nodep->v3fatalSrc("Traversal should have been short circuited");
} // LCOV_EXCL_STOP } // LCOV_EXCL_STOP
void visit(AstNodeFile*) override {} // Accelerate void visit(AstNodeFile*) override {} // Accelerate
void visit(AstNodeDType*) override {} // Accelerate void visit(AstNodeDType*) override {} // Accelerate

View File

@ -171,7 +171,7 @@ public:
if (dumpLevel() >= 6 || force) { if (dumpLevel() >= 6 || force) {
const string filename = v3Global.debugFilename(nameComment) + ".txt"; const string filename = v3Global.debugFilename(nameComment) + ".txt";
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
std::ostream& os = *logp; std::ostream& os = *logp;
// TODO the symbol table has node pointers which may be // TODO the symbol table has node pointers which may be
// dangling, as we call deleteTree in these visitors without // dangling, as we call deleteTree in these visitors without

View File

@ -474,7 +474,7 @@ void V3Options::decorations(FileLine* fl, const string& arg) { // --decorations
m_decoration = true; m_decoration = true;
m_decorationNodes = false; m_decorationNodes = false;
} else { } else {
fl->v3fatal("Unknown setting for --decorations: '" fl->v3error("Unknown setting for --decorations: '"
<< arg << "'\n" << arg << "'\n"
<< fl->warnMore() << "... Suggest 'none', 'medium', or 'node'"); << fl->warnMore() << "... Suggest 'none', 'medium', or 'node'");
} }
@ -1196,7 +1196,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
DECL_OPTION("-build-jobs", CbVal, [this, fl](const char* valp) { DECL_OPTION("-build-jobs", CbVal, [this, fl](const char* valp) {
int val = std::atoi(valp); int val = std::atoi(valp);
if (val < 0) { if (val < 0) {
fl->v3fatal("--build-jobs requires a non-negative integer, but '" << valp fl->v3error("--build-jobs requires a non-negative integer, but '" << valp
<< "' was passed"); << "' was passed");
val = 1; val = 1;
} else if (val == 0) { } else if (val == 0) {
@ -1229,7 +1229,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
m_compLimitMembers = 0; // probably ok, and AFAIK doesn't support anon structs m_compLimitMembers = 0; // probably ok, and AFAIK doesn't support anon structs
m_compLimitParens = 80; // 128, but allow some room m_compLimitParens = 80; // 128, but allow some room
} else { } else {
fl->v3fatal("Unknown setting for --compiler: '" fl->v3error("Unknown setting for --compiler: '"
<< valp << "'\n" << valp << "'\n"
<< fl->warnMore() << "... Suggest 'clang', 'gcc', or 'msvc'"); << fl->warnMore() << "... Suggest 'clang', 'gcc', or 'msvc'");
} }
@ -1417,7 +1417,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
for (int i = V3LangCode::L_ERROR + 1; i < V3LangCode::_ENUM_END; ++i) { for (int i = V3LangCode::L_ERROR + 1; i < V3LangCode::_ENUM_END; ++i) {
spell.pushCandidate(V3LangCode{i}.ascii()); spell.pushCandidate(V3LangCode{i}.ascii());
} }
fl->v3fatal("Unknown language specified: " << valp << spell.bestCandidateMsg(valp)); fl->v3error("Unknown language specified: " << valp << spell.bestCandidateMsg(valp));
} }
}; };
DECL_OPTION("-default-language", CbVal, setLang); DECL_OPTION("-default-language", CbVal, setLang);
@ -1446,7 +1446,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
} else if (!std::strcmp(valp, "json")) { } else if (!std::strcmp(valp, "json")) {
m_makeJson = true; m_makeJson = true;
} else { } else {
fl->v3fatal("Unknown --make system specified: '" << valp << "'"); fl->v3error("Unknown --make system specified: '" << valp << "'");
} }
}); });
DECL_OPTION("-max-num-width", Set, &m_maxNumWidth); DECL_OPTION("-max-num-width", Set, &m_maxNumWidth);
@ -1487,7 +1487,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
DECL_OPTION("-no-pins64", CbCall, [this]() { m_pinsBv = 33; }); DECL_OPTION("-no-pins64", CbCall, [this]() { m_pinsBv = 33; });
DECL_OPTION("-pins-bv", CbVal, [this, fl](const char* valp) { DECL_OPTION("-pins-bv", CbVal, [this, fl](const char* valp) {
m_pinsBv = std::atoi(valp); m_pinsBv = std::atoi(valp);
if (m_pinsBv > 65) fl->v3fatal("--pins-bv maximum is 65: " << valp); if (m_pinsBv > 65) fl->v3error("--pins-bv maximum is 65: " << valp);
}); });
DECL_OPTION("-pins-inout-enables", OnOff, &m_pinsInoutEnables); DECL_OPTION("-pins-inout-enables", OnOff, &m_pinsInoutEnables);
DECL_OPTION("-pins-sc-uint", CbOnOff, [this](bool flag) { DECL_OPTION("-pins-sc-uint", CbOnOff, [this](bool flag) {
@ -1608,7 +1608,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
m_threadsDpiPure = true; m_threadsDpiPure = true;
m_threadsDpiUnpure = false; m_threadsDpiUnpure = false;
} else { } else {
fl->v3fatal("Unknown setting for --threads-dpi: '" fl->v3error("Unknown setting for --threads-dpi: '"
<< valp << "'\n" << valp << "'\n"
<< fl->warnMore() << "... Suggest 'all', 'none', or 'pure'"); << fl->warnMore() << "... Suggest 'all', 'none', or 'pure'");
} }
@ -1796,7 +1796,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
} else if (!std::strcmp(valp, "unique")) { } else if (!std::strcmp(valp, "unique")) {
m_xAssign = "unique"; m_xAssign = "unique";
} else { } else {
fl->v3fatal("Unknown setting for --x-assign: '" fl->v3error("Unknown setting for --x-assign: '"
<< valp << "'\n" << valp << "'\n"
<< fl->warnMore() << "... Suggest '0', '1', 'fast', or 'unique'"); << fl->warnMore() << "... Suggest '0', '1', 'fast', or 'unique'");
} }
@ -1809,7 +1809,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
} else if (!std::strcmp(valp, "unique")) { } else if (!std::strcmp(valp, "unique")) {
m_xInitial = "unique"; m_xInitial = "unique";
} else { } else {
fl->v3fatal("Unknown setting for --x-initial: '" fl->v3error("Unknown setting for --x-initial: '"
<< valp << "'\n" << valp << "'\n"
<< fl->warnMore() << "... Suggest '0', 'fast', or 'unique'"); << fl->warnMore() << "... Suggest '0', 'fast', or 'unique'");
} }

View File

@ -556,7 +556,7 @@ public:
UINFO(1, "Writing " << filename << endl); UINFO(1, "Writing " << filename << endl);
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
std::ostream* const osp = &(*ofp); // &* needed to deref unique_ptr std::ostream* const osp = &(*ofp); // &* needed to deref unique_ptr
if (osp->fail()) v3fatalStatic("Can't write " << filename); if (osp->fail()) v3fatalStatic("Can't write file: " << filename);
// Find start vertex with longest CP // Find start vertex with longest CP
const LogicMTask* startp = nullptr; const LogicMTask* startp = nullptr;

View File

@ -158,7 +158,7 @@ class V3OrderProcessDomains final {
// Make report of all signal names and what clock edges they have // Make report of all signal names and what clock edges they have
const string filename = v3Global.debugFilename(m_tag + "_order_edges.txt"); const string filename = v3Global.debugFilename(m_tag + "_order_edges.txt");
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
std::deque<string> report; std::deque<string> report;

View File

@ -336,7 +336,7 @@ void V3ParseImp::parseFile(FileLine* fileline, const string& modfilename, bool i
osp = ofp = V3File::new_ofstream(vppfilename); osp = ofp = V3File::new_ofstream(vppfilename);
} }
if (osp->fail()) { if (osp->fail()) {
fileline->v3error("Cannot write preprocessor output: " + vppfilename); fileline->v3error("Can't write file: " + vppfilename);
return; return;
} }
if (v3Global.opt.dumpDefines()) { if (v3Global.opt.dumpDefines()) {
@ -371,7 +371,7 @@ void V3ParseImp::dumpInputsFile() {
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__inputs.vpp"; = v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__inputs.vpp";
std::ofstream* ofp = V3File::new_ofstream(vppfilename, append); std::ofstream* ofp = V3File::new_ofstream(vppfilename, append);
if (ofp->fail()) { if (ofp->fail()) {
v3error("Cannot write preprocessor output: " + vppfilename); v3error("Can't write file: " + vppfilename);
return; return;
} }
if (!append) { if (!append) {

View File

@ -242,7 +242,7 @@ private:
void statePop() { void statePop() {
m_states.pop(); m_states.pop();
if (VL_UNCOVERABLE(m_states.empty())) { if (VL_UNCOVERABLE(m_states.empty())) {
error("InternalError: Pop of parser state with nothing on stack"); // LCOV_EXCL_LINE fileline()->v3fatalSrc("Pop of parser state with nothing on stack");
m_states.push(ps_TOP); // LCOV_EXCL_LINE m_states.push(ps_TOP); // LCOV_EXCL_LINE
} }
} }
@ -640,8 +640,8 @@ string V3PreProcImp::defineSubst(VDefineRef* refp) {
const string arg = trimWhitespace(refp->args()[numArgs], true); const string arg = trimWhitespace(refp->args()[numArgs], true);
if (arg != "") valueDef = arg; if (arg != "") valueDef = arg;
} else if (!haveDefault) { } else if (!haveDefault) {
error("Define missing argument '" + argName + "' for: " + refp->name() fileline()->v3error("Define missing argument '" + argName
+ "\n"); + "' for: " + refp->name());
return " `" + refp->name() + " "; return " `" + refp->name() + " ";
} }
numArgs++; numArgs++;
@ -679,7 +679,7 @@ string V3PreProcImp::defineSubst(VDefineRef* refp) {
// `define X() is ok to call with nothing // `define X() is ok to call with nothing
&& !(refp->args().size() == 1 && numArgs == 0 && !(refp->args().size() == 1 && numArgs == 0
&& trimWhitespace(refp->args()[0], false) == "")) { && trimWhitespace(refp->args()[0], false) == "")) {
error("Define passed too many arguments: " + refp->name() + "\n"); fileline()->v3error("Define passed too many arguments: " + refp->name());
return " `" + refp->name() + " "; return " `" + refp->name() + " ";
} }
} }
@ -800,7 +800,7 @@ void V3PreProcImp::openFile(FileLine*, VInFilter* filterp, const string& filenam
StrList wholefile; StrList wholefile;
const bool ok = filterp->readWholefile(filename, wholefile /*ref*/); const bool ok = filterp->readWholefile(filename, wholefile /*ref*/);
if (!ok) { if (!ok) {
error("File not found: " + filename + "\n"); fileline()->v3error("File not found: " + filename);
return; return;
} }
@ -808,7 +808,7 @@ void V3PreProcImp::openFile(FileLine*, VInFilter* filterp, const string& filenam
// We allow the same include file twice, because occasionally it pops // We allow the same include file twice, because occasionally it pops
// up, with guards preventing a real recursion. // up, with guards preventing a real recursion.
if (m_lexp->m_streampStack.size() > V3PreProc::INCLUDE_DEPTH_MAX) { if (m_lexp->m_streampStack.size() > V3PreProc::INCLUDE_DEPTH_MAX) {
error("Recursive inclusion of file: " + filename); fileline()->v3error("Recursive inclusion of file: " + filename);
// Include might be a tree of includes that is O(n^2) or worse. // Include might be a tree of includes that is O(n^2) or worse.
// Once hit this error then, ignore all further includes so can unwind. // Once hit this error then, ignore all further includes so can unwind.
m_incError = true; m_incError = true;
@ -964,8 +964,9 @@ int V3PreProcImp::getRawToken() {
m_lastLineno = m_lexp->m_tokFilelinep->lineno(); m_lastLineno = m_lexp->m_tokFilelinep->lineno();
m_tokensOnLine = 0; m_tokensOnLine = 0;
} else if (++m_tokensOnLine > v3Global.opt.preprocTokenLimit()) { } else if (++m_tokensOnLine > v3Global.opt.preprocTokenLimit()) {
error("Too many preprocessor tokens on a line (>" fileline()->v3error("Too many preprocessor tokens on a line (>"
+ cvtToStr(v3Global.opt.preprocTokenLimit()) + "); perhaps recursive `define"); + cvtToStr(v3Global.opt.preprocTokenLimit())
+ "); perhaps recursive `define");
tok = VP_EOF_ERROR; tok = VP_EOF_ERROR;
} }
@ -1103,7 +1104,7 @@ int V3PreProcImp::getStateToken() {
goto next_tok; goto next_tok;
} else if (state() == ps_DEFNAME_ELSIF) { } else if (state() == ps_DEFNAME_ELSIF) {
if (m_ifdefStack.empty()) { if (m_ifdefStack.empty()) {
error("`elsif with no matching `if\n"); fileline()->v3error("`elsif with no matching `if");
} else { } else {
// Handle `else portion // Handle `else portion
const VPreIfEntry lastIf = m_ifdefStack.top(); const VPreIfEntry lastIf = m_ifdefStack.top();
@ -1159,7 +1160,7 @@ int V3PreProcImp::getStateToken() {
// IE, `ifdef `MACRO(x): Substitute and come back here when state pops. // IE, `ifdef `MACRO(x): Substitute and come back here when state pops.
break; break;
} else { } else {
error("Expecting define name. Found: "s + tokenName(tok) + "\n"); fileline()->v3error("Expecting define name. Found: "s + tokenName(tok));
goto next_tok; goto next_tok;
} }
} }
@ -1208,7 +1209,7 @@ int V3PreProcImp::getStateToken() {
goto next_tok; goto next_tok;
} else if (state() == ps_EXPR_ELSIF) { } else if (state() == ps_EXPR_ELSIF) {
if (m_ifdefStack.empty()) { if (m_ifdefStack.empty()) {
error("`elsif with no matching `if\n"); fileline()->v3error("`elsif with no matching `if");
} else { } else {
// Handle `else portion // Handle `else portion
const VPreIfEntry lastIf = m_ifdefStack.top(); const VPreIfEntry lastIf = m_ifdefStack.top();
@ -1243,8 +1244,8 @@ int V3PreProcImp::getStateToken() {
if (VString::removeWhitespace(string{yyourtext(), yyourleng()}).empty()) { if (VString::removeWhitespace(string{yyourtext(), yyourleng()}).empty()) {
return tok; return tok;
} else { } else {
error("Syntax error in `ifdef () expression; unexpected: '"s + tokenName(tok) fileline()->v3error("Syntax error in `ifdef () expression; unexpected: '"s
+ "'\n"); + tokenName(tok) + "'");
} }
goto next_tok; goto next_tok;
} }
@ -1266,7 +1267,8 @@ int V3PreProcImp::getStateToken() {
goto next_tok; goto next_tok;
} }
} else { } else {
error("Expecting define formal arguments. Found: "s + tokenName(tok) + "\n"); fileline()->v3error("Expecting define formal arguments. Found: "s + tokenName(tok)
+ "\n");
goto next_tok; goto next_tok;
} }
} }
@ -1318,8 +1320,8 @@ int V3PreProcImp::getStateToken() {
} else { } else {
UASSERT(!m_defRefs.empty(), "Shouldn't be in DEFPAREN w/o active defref"); UASSERT(!m_defRefs.empty(), "Shouldn't be in DEFPAREN w/o active defref");
const VDefineRef* const refp = &(m_defRefs.top()); const VDefineRef* const refp = &(m_defRefs.top());
error("Expecting ( to begin argument list for define reference `"s + refp->name() fileline()->v3error("Expecting ( to begin argument list for define reference `"s
+ "\n"); + refp->name());
statePop(); statePop();
goto next_tok; goto next_tok;
} }
@ -1392,8 +1394,8 @@ int V3PreProcImp::getStateToken() {
statePush(ps_STRIFY); statePush(ps_STRIFY);
goto next_tok; goto next_tok;
} else { } else {
error(std::string{ fileline()->v3error(
"Expecting ) or , to end argument list for define reference. Found: "} "Expecting ) or , to end argument list for define reference. Found: "s
+ tokenName(tok)); + tokenName(tok));
statePop(); statePop();
goto next_tok; goto next_tok;
@ -1419,7 +1421,7 @@ int V3PreProcImp::getStateToken() {
break; break;
} else { } else {
statePop(); statePop();
error("Expecting include filename. Found: "s + tokenName(tok) + "\n"); fileline()->v3error("Expecting include filename. Found: "s + tokenName(tok));
goto next_tok; goto next_tok;
} }
} }
@ -1427,12 +1429,12 @@ int V3PreProcImp::getStateToken() {
if (tok == VP_STRING) { if (tok == VP_STRING) {
if (!m_off) { if (!m_off) {
m_lastSym.assign(yyourtext(), yyourleng()); m_lastSym.assign(yyourtext(), yyourleng());
error(m_lastSym); fileline()->v3error(m_lastSym);
} }
statePop(); statePop();
goto next_tok; goto next_tok;
} else { } else {
error("Expecting `error string. Found: "s + tokenName(tok) + "\n"); fileline()->v3error("Expecting `error string. Found: "s + tokenName(tok));
statePop(); statePop();
goto next_tok; goto next_tok;
} }
@ -1479,7 +1481,7 @@ int V3PreProcImp::getStateToken() {
statePop(); statePop();
goto next_tok; goto next_tok;
} else if (tok == VP_EOF) { } else if (tok == VP_EOF) {
error("`\" not terminated at EOF\n"); fileline()->v3error("`\" not terminated at EOF");
break; break;
} else if (tok == VP_BACKQUOTE) { } else if (tok == VP_BACKQUOTE) {
m_strify += "\\\""; m_strify += "\\\"";
@ -1513,7 +1515,7 @@ int V3PreProcImp::getStateToken() {
case VP_ELSIF: statePush(ps_DEFNAME_ELSIF); goto next_tok; case VP_ELSIF: statePush(ps_DEFNAME_ELSIF); goto next_tok;
case VP_ELSE: case VP_ELSE:
if (m_ifdefStack.empty()) { if (m_ifdefStack.empty()) {
error("`else with no matching `if\n"); fileline()->v3error("`else with no matching `if");
} else { } else {
const VPreIfEntry lastIf = m_ifdefStack.top(); const VPreIfEntry lastIf = m_ifdefStack.top();
m_ifdefStack.pop(); m_ifdefStack.pop();
@ -1527,7 +1529,7 @@ int V3PreProcImp::getStateToken() {
case VP_ENDIF: case VP_ENDIF:
UINFO(4, "Endif " << endl); UINFO(4, "Endif " << endl);
if (m_ifdefStack.empty()) { if (m_ifdefStack.empty()) {
error("`endif with no matching `if\n"); fileline()->v3error("`endif with no matching `if");
} else { } else {
const VPreIfEntry lastIf = m_ifdefStack.top(); const VPreIfEntry lastIf = m_ifdefStack.top();
m_ifdefStack.pop(); m_ifdefStack.pop();
@ -1547,7 +1549,7 @@ int V3PreProcImp::getStateToken() {
unputString("``"); unputString("``");
} }
if (m_defDepth++ > V3PreProc::DEFINE_RECURSION_LEVEL_MAX) { if (m_defDepth++ > V3PreProc::DEFINE_RECURSION_LEVEL_MAX) {
error("Recursive `define substitution: `" + name); fileline()->v3error("Recursive `define substitution: `" + name);
goto next_tok; goto next_tok;
} }
// Substitute // Substitute
@ -1618,7 +1620,7 @@ int V3PreProcImp::getStateToken() {
goto next_tok; goto next_tok;
} }
case VP_EOF: case VP_EOF:
if (!m_ifdefStack.empty()) error("`ifdef not terminated at EOF\n"); if (!m_ifdefStack.empty()) fileline()->v3error("`ifdef not terminated at EOF");
return tok; return tok;
case VP_UNDEFINEALL: case VP_UNDEFINEALL:
if (!m_off) { if (!m_off) {

View File

@ -84,8 +84,6 @@ public:
virtual string removeDefines(const string& text) = 0; // Remove defines in a text string virtual string removeDefines(const string& text) = 0; // Remove defines in a text string
// UTILITIES // UTILITIES
void error(const string& msg) { fileline()->v3error(msg); } ///< Report an error
void fatal(const string& msg) { fileline()->v3fatalSrc(msg); } ///< Report a fatal error
virtual void dumpDefines(std::ostream& os) = 0; ///< Print list of `defines virtual void dumpDefines(std::ostream& os) = 0; ///< Print list of `defines
virtual void candidateDefines(VSpellCheck* spellerp) = 0; ///< Spell check candidate defines virtual void candidateDefines(VSpellCheck* spellerp) = 0; ///< Spell check candidate defines

View File

@ -235,7 +235,7 @@ class RandomizeMarkVisitor final : public VNVisitor {
"Unsupported: 'rand_mode()' on dynamic array element"); "Unsupported: 'rand_mode()' on dynamic array element");
valid = false; valid = false;
} else { } else {
methodHardp->v3fatal("Unknown rand_mode() receiver"); methodHardp->v3fatalSrc("Unknown rand_mode() receiver");
} }
} }
if (!nodep->pinsp() && VN_IS(nodep->backp(), StmtExpr)) { if (!nodep->pinsp() && VN_IS(nodep->backp(), StmtExpr)) {

View File

@ -108,7 +108,7 @@ public:
case REACTIVE | OBSERVED | INPUT | NBA: return "plum"; case REACTIVE | OBSERVED | INPUT | NBA: return "plum";
case REACTIVE | OBSERVED | ACTIVE | NBA: return "lightSeaGreen"; case REACTIVE | OBSERVED | ACTIVE | NBA: return "lightSeaGreen";
case REACTIVE | OBSERVED | INPUT | ACTIVE | NBA: return "gray50"; case REACTIVE | OBSERVED | INPUT | ACTIVE | NBA: return "gray50";
default: v3fatal("There are only 5 region bits"); return ""; default: v3fatalSrc("There are only 5 region bits"); return "";
} }
} }
// LCOV_EXCL_STOP // LCOV_EXCL_STOP

View File

@ -234,7 +234,7 @@ void V3Stats::statsReport() {
const string filename const string filename
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__stats.txt"; = v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__stats.txt";
std::ofstream* ofp{V3File::new_ofstream(filename)}; std::ofstream* ofp{V3File::new_ofstream(filename)};
if (ofp->fail()) v3fatal("Can't write " << filename); if (ofp->fail()) v3fatal("Can't write file: " << filename);
{ StatsReport{ofp}; } // Destruct before cleanup { StatsReport{ofp}; } // Destruct before cleanup

View File

@ -319,7 +319,7 @@ public:
const string filename = v3Global.debugFilename(nameComment) + ".txt"; const string filename = v3Global.debugFilename(nameComment) + ".txt";
UINFO(2, "Dumping " << filename << endl); UINFO(2, "Dumping " << filename << endl);
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
dumpSelf(*logp, ""); dumpSelf(*logp, "");
} }
} }

View File

@ -397,7 +397,7 @@ public:
if (dumpLevel()) { if (dumpLevel()) {
const string filename = v3Global.debugFilename(nameComment) + ".txt"; const string filename = v3Global.debugFilename(nameComment) + ".txt";
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
if (logp->fail()) v3fatal("Can't write " << filename); if (logp->fail()) v3fatal("Can't write file: " << filename);
dumpGraph(*logp, nameComment); dumpGraph(*logp, nameComment);
} }
} }

View File

@ -77,7 +77,7 @@ void V3Waiver::addEntry(V3ErrorCode errorCode, const std::string& filename, cons
void V3Waiver::write(const std::string& filename) VL_MT_SAFE_EXCLUDES(s_mutex) { void V3Waiver::write(const std::string& filename) VL_MT_SAFE_EXCLUDES(s_mutex) {
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)}; const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
if (ofp->fail()) v3fatal("Can't write " << filename); if (ofp->fail()) v3fatal("Can't write file: " << filename);
*ofp << "// DESCR" *ofp << "// DESCR"
"IPTION: Verilator output: Waivers generated with --waiver-output\n\n"; "IPTION: Verilator output: Waivers generated with --waiver-output\n\n";

View File

@ -5881,7 +5881,7 @@ class WidthVisitor final : public VNVisitor {
} else if (VN_IS(propStmtp, PropSpec)) { } else if (VN_IS(propStmtp, PropSpec)) {
iterateCheckSelf(nodep, "PropSpec", propStmtp, SELF, BOTH); iterateCheckSelf(nodep, "PropSpec", propStmtp, SELF, BOTH);
} else { } else {
propStmtp->v3fatal("Invalid statement under AstProperty"); propStmtp->v3fatalSrc("Invalid statement under AstProperty");
} }
} }
nodep->didWidth(true); nodep->didWidth(true);

View File

@ -35,7 +35,7 @@ void VlcTop::readCoverage(const string& filename, bool nonfatal) {
std::ifstream is{filename.c_str()}; std::ifstream is{filename.c_str()};
if (!is) { if (!is) {
if (!nonfatal) v3fatal("Can't read " << filename); if (!nonfatal) v3fatal("Can't read coverage file: " << filename);
return; return;
} }
@ -70,7 +70,7 @@ void VlcTop::writeCoverage(const string& filename) {
std::ofstream os{filename.c_str()}; std::ofstream os{filename.c_str()};
if (!os) { if (!os) {
v3fatal("Can't write " << filename); v3fatal("Can't write file: " << filename);
return; return;
} }
@ -86,7 +86,7 @@ void VlcTop::writeInfo(const string& filename) {
std::ofstream os{filename.c_str()}; std::ofstream os{filename.c_str()};
if (!os) { if (!os) {
v3fatal("Can't write " << filename); v3fatal("Can't write file: " << filename);
return; return;
} }
@ -285,13 +285,13 @@ void VlcTop::annotateOutputFiles(const string& dirname) {
std::ifstream is{filename.c_str()}; std::ifstream is{filename.c_str()};
if (!is) { if (!is) {
v3error("Can't read " << filename); v3error("Can't read annotation file: " << filename);
return; return;
} }
std::ofstream os{outfilename.c_str()}; std::ofstream os{outfilename.c_str()};
if (!os) { if (!os) {
v3fatal("Can't write " << outfilename); v3error("Can't write file: " << outfilename);
return; return;
} }

View File

@ -29,19 +29,30 @@ for s in [
'dynamic new() not expected in this context (expected under an assign)', # Instead get syntax error 'dynamic new() not expected in this context (expected under an assign)', # Instead get syntax error
# Not yet analyzed # Not yet analyzed
' loading non-variable', ' loading non-variable',
'--pins-bv maximum is 65: ',
'--pipe-filter protocol error, unexpected: ', '--pipe-filter protocol error, unexpected: ',
'--pipe-filter returned bad status',
'--pipe-filter: Can\'t pipe: ',
'--pipe-filter: fork failed: ',
'--threads must be >= 0: ',
'--threads-max-mtasks must be >= 1: ',
'--trace-threads must be >= 1: ',
'/*verilator sformat*/ can only be applied to last argument of ', '/*verilator sformat*/ can only be applied to last argument of ',
'Argument needed for string.', 'Argument needed for string.',
'Array initialization has too few elements, need element ', 'Array initialization has too few elements, need element ',
'Assigned pin is neither input nor output', 'Assigned pin is neither input nor output',
'Assignment pattern with no members', 'Assignment pattern with no members',
'Can\'t find varpin scope of ', 'Can\'t find varpin scope of ',
'Can\'t read annotation file: ',
'Can\'t resolve module reference: \'', 'Can\'t resolve module reference: \'',
'Cannot write preprocessor output: ', 'Can\'t write file: ',
'Circular logic when ordering code (non-cutable edge loop)', 'Circular logic when ordering code (non-cutable edge loop)',
'Define missing argument \'',
'Define or directive not defined: `', 'Define or directive not defined: `',
'Exceeded limit of ', 'Exceeded limit of ',
'Expecting define formal arguments. Found: ',
'Extern declaration\'s scope is not a defined class', 'Extern declaration\'s scope is not a defined class',
'File not found: ',
'Format to $display-like function must have constant format string', 'Format to $display-like function must have constant format string',
'Forward typedef used as class/package does not resolve to class/package: ', 'Forward typedef used as class/package does not resolve to class/package: ',
'Illegal +: or -: select; type already selected, or bad dimension: ', 'Illegal +: or -: select; type already selected, or bad dimension: ',
@ -62,6 +73,7 @@ for s in [
'String of ', 'String of ',
'Symbol matching ', 'Symbol matching ',
'Unexpected connection to arrayed port', 'Unexpected connection to arrayed port',
'Unmatched brackets in variable substitution in file: ',
'Unsized numbers/parameters not allowed in streams.', 'Unsized numbers/parameters not allowed in streams.',
'Unsupported RHS tristate construct: ', 'Unsupported RHS tristate construct: ',
'Unsupported or syntax error: Unsized range in instance or other declaration', 'Unsupported or syntax error: Unsized range in instance or other declaration',
@ -72,9 +84,6 @@ for s in [
'Unsupported: $bits for queue', 'Unsupported: $bits for queue',
'Unsupported: $c can\'t generate wider than 64 bits', 'Unsupported: $c can\'t generate wider than 64 bits',
'Unsupported: &&& expression', 'Unsupported: &&& expression',
'Unsupported: \'default :/\' constraint',
'Unsupported: \'{} .* patterns',
'Unsupported: \'{} tagged patterns',
'Unsupported: +%- range', 'Unsupported: +%- range',
'Unsupported: +/- range', 'Unsupported: +/- range',
'Unsupported: 4-state numbers in this context', 'Unsupported: 4-state numbers in this context',
@ -96,9 +105,11 @@ for s in [
'Unsupported: Verilog 1995 deassign', 'Unsupported: Verilog 1995 deassign',
'Unsupported: Verilog 1995 gate primitive: ', 'Unsupported: Verilog 1995 gate primitive: ',
'Unsupported: [] dimensions', 'Unsupported: [] dimensions',
'Unsupported: \'default :/\' constraint',
'Unsupported: \'{} .* patterns',
'Unsupported: \'{} tagged patterns',
'Unsupported: always[] (in property expression)', 'Unsupported: always[] (in property expression)',
'Unsupported: assertion items in clocking blocks', 'Unsupported: assertion items in clocking blocks',
'Unsupported: covergroup within class',
'Unsupported: default clocking identifier', 'Unsupported: default clocking identifier',
'Unsupported: don\'t know how to deal with ', 'Unsupported: don\'t know how to deal with ',
'Unsupported: eventually[] (in property expression)', 'Unsupported: eventually[] (in property expression)',
@ -106,18 +117,18 @@ for s in [
'Unsupported: extern interface', 'Unsupported: extern interface',
'Unsupported: extern module', 'Unsupported: extern module',
'Unsupported: extern task', 'Unsupported: extern task',
'Unsupported: modport export',
'Unsupported: no_inline for tasks',
'Unsupported: property port \'local\'', 'Unsupported: property port \'local\'',
'Unsupported: randsequence production list', 'Unsupported: randsequence production list',
'Unsupported: randsequence repeat', 'Unsupported: randsequence repeat',
'Unsupported: repeat event control', 'Unsupported: repeat event control',
'Unsupported: s_always (in property expression)', 'Unsupported: s_always (in property expression)',
'Unsupported: static cast to ',
'Unsupported: super',
'Unsupported: this.super', 'Unsupported: this.super',
'Unsupported: trireg', 'Unsupported: trireg',
'Unsupported: with[] stream expression', 'Unsupported: with[] stream expression',
'Unsupported: modport export',
'Unsupported: no_inline for tasks',
'Unsupported: static cast to ',
'Unsupported: super',
]: ]:
Suppressed[s] = True Suppressed[s] = True
@ -137,11 +148,11 @@ def read_messages():
continue continue
if re.match(r'^\s*/\*', line): if re.match(r'^\s*/\*', line):
continue continue
if re.search(r'\b(v3error|v3warn|BBUNSUP)\b\($', line): if re.search(r'\b(v3error|v3warn|v3fatal|BBUNSUP)\b\($', line):
if 'LCOV_EXCL_LINE' not in line: if 'LCOV_EXCL_LINE' not in line:
read_next = True read_next = True
continue continue
m = re.search(r'.*\b(v3error|v3warn|BBUNSUP)\b(.*)', line) m = re.search(r'.*\b(v3error|v3warn|v3fatal|BBUNSUP)\b(.*)', line)
if m: if m:
line = m.group(2) line = m.group(2)
if 'LCOV_EXCL_LINE' not in line: if 'LCOV_EXCL_LINE' not in line:
@ -185,13 +196,13 @@ def check():
read_outputs() read_outputs()
print("Number of suppressions = " + str(len(Suppressed))) print("Number of suppressions = " + str(len(Suppressed)))
print("Coverage = ", str(100 - int(100 * len(Suppressed) / len(Messages)))) print("Coverage = %3.1f%%" % (100 - int(100 * len(Suppressed) / len(Messages))))
print() print()
print("Checking for v3error/v3warn messages in sources without") print("Checking for v3error/v3warn messages in sources without")
print("coverage in test_regress/t/*.out:") print("coverage in test_regress/t/*.out:")
print("(Developers: If a message is impossible to test, use UASSERT or") print("(Developers: If a message is impossible to test, consider using")
print("v3fatalSrc instead of v3error)") print("UASSERT or v3fatalSrc instead of v3error)")
print() print()
used_suppressed = {} used_suppressed = {}

View File

@ -1 +1,3 @@
%Error: --build-jobs requires a non-negative integer, but '-1' was passed %Error: --build-jobs requires a non-negative integer, but '-1' was passed
%Error: The following cannot be used together: --build, --lint-only. Suggest see manual
%Error: Exiting due to

View File

@ -1,2 +1,3 @@
%Error: Unknown setting for --compiler: 'bad_one' %Error: Unknown setting for --compiler: 'bad_one'
... Suggest 'clang', 'gcc', or 'msvc' ... Suggest 'clang', 'gcc', or 'msvc'
%Error: Exiting due to

View File

@ -1,2 +1,3 @@
%Error: Unknown setting for --decorations: 'BAD' %Error: Unknown setting for --decorations: 'BAD'
... Suggest 'none', 'medium', or 'node' ... Suggest 'none', 'medium', or 'node'
%Error: Exiting due to

View File

@ -1 +1,2 @@
%Error: Unknown --make system specified: 'bad_one' %Error: Unknown --make system specified: 'bad_one'
%Error: Exiting due to

View File

@ -9,3 +9,4 @@
%Error: Invalid option: -Won-SPLITVAR... Suggested alternative: '-Wno-SPLITVAR' %Error: Invalid option: -Won-SPLITVAR... Suggested alternative: '-Wno-SPLITVAR'
%Error: Unknown warning specified: -Wno-SPLITVER... Suggested alternative: '-Wno-SPLITVAR' %Error: Unknown warning specified: -Wno-SPLITVER... Suggested alternative: '-Wno-SPLITVAR'
%Error: Unknown language specified: 1364-1997... Suggested alternative: '1364-1995' %Error: Unknown language specified: 1364-1997... Suggested alternative: '1364-1995'
%Error: verilator: No Input Verilog file specified on command line, see verilator --help for more information

View File

@ -1,2 +1,3 @@
%Error: Unknown setting for --threads-dpi: 'bad_one' %Error: Unknown setting for --threads-dpi: 'bad_one'
... Suggest 'all', 'none', or 'pure' ... Suggest 'all', 'none', or 'pure'
%Error: Exiting due to

View File

@ -1,2 +1,3 @@
%Error: Unknown setting for --x-assign: 'bad_one' %Error: Unknown setting for --x-assign: 'bad_one'
... Suggest '0', '1', 'fast', or 'unique' ... Suggest '0', '1', 'fast', or 'unique'
%Error: Exiting due to

View File

@ -1,2 +1,3 @@
%Error: Unknown setting for --x-initial: 'bad_one' %Error: Unknown setting for --x-initial: 'bad_one'
... Suggest '0', 'fast', or 'unique' ... Suggest '0', 'fast', or 'unique'
%Error: Exiting due to

View File

@ -0,0 +1,4 @@
%Error: t/t_preproc_ifdefend_bad.v:9:1: `ifdef not terminated at EOF
9 | %Error-internal-contents-bad-ct2-ln9
| ^
%Error: Exiting due to

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2024 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
import vltest_bootstrap
test.scenarios('linter')
test.lint(fails=True, verilator_flags2=['--no-std'], expect_filename=test.golden_filename)
test.passes()

View File

@ -0,0 +1,7 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2019 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
`ifdef FOO

View File

@ -1 +1 @@
%Error: Can't read t/t_NOT_FOUND %Error: Can't read coverage file: t/t_NOT_FOUND