diff --git a/frontends/parsers/p4/p4parser.ypp b/frontends/parsers/p4/p4parser.ypp index 52c6ddc8b96..7d392dde599 100644 --- a/frontends/parsers/p4/p4parser.ypp +++ b/frontends/parsers/p4/p4parser.ypp @@ -152,10 +152,10 @@ inline std::ostream& operator<<(std::ostream& out, const Token& t) { using namespace P4; -#define YYLLOC_DEFAULT(Cur, Rhs, N) \ - ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ - : Util::SourceInfo(driver.sources, YYRHSLOC(Rhs, 0).getEnd())) - +#define YYLLOC_DEFAULT(Cur, Rhs, N) \ + ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ + : YYRHSLOC(Rhs, 0) ? Util::SourceInfo(driver.sources, YYRHSLOC(Rhs, 0).getEnd()) \ + : Util::SourceInfo(driver.sources, driver.sources->getCurrentPosition())) #undef yylex #define yylex lexer.yylex diff --git a/frontends/parsers/parserDriver.cpp b/frontends/parsers/parserDriver.cpp index 3e26d3f04b4..5a97d8508fc 100644 --- a/frontends/parsers/parserDriver.cpp +++ b/frontends/parsers/parserDriver.cpp @@ -69,7 +69,7 @@ struct AutoStdioInputStream { namespace P4 { -AbstractParserDriver::AbstractParserDriver() : sources(new Util::InputSources) {} +AbstractParserDriver::AbstractParserDriver() : sources(new Util::InputSources()) {} AbstractParserDriver::~AbstractParserDriver() {} diff --git a/frontends/parsers/v1/v1parser.ypp b/frontends/parsers/v1/v1parser.ypp index f640d1ffbb8..710acc15245 100644 --- a/frontends/parsers/v1/v1parser.ypp +++ b/frontends/parsers/v1/v1parser.ypp @@ -128,9 +128,10 @@ typedef const IR::Type ConstType; using namespace P4; -#define YYLLOC_DEFAULT(Cur, Rhs, N) \ - ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ - : Util::SourceInfo(driver.sources, YYRHSLOC(Rhs, 0).getEnd())) +#define YYLLOC_DEFAULT(Cur, Rhs, N) \ + ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ + : YYRHSLOC(Rhs, 0) ? Util::SourceInfo(driver.sources, YYRHSLOC(Rhs, 0).getEnd()) \ + : Util::SourceInfo(driver.sources, driver.sources->getCurrentPosition())) #undef yylex #define yylex lexer.yylex diff --git a/lib/source_file.cpp b/lib/source_file.cpp index 51cbd6a444a..e0551498c9e 100644 --- a/lib/source_file.cpp +++ b/lib/source_file.cpp @@ -51,12 +51,24 @@ cstring SourcePosition::toString() const { SourceInfo::SourceInfo(const InputSources *sources, SourcePosition start, SourcePosition end) : sources(sources), start(start), end(end) { BUG_CHECK(sources != nullptr, "Invalid InputSources in SourceInfo"); - if (!start.isValid() || !end.isValid()) - BUG("Invalid source position in SourceInfo %1%-%2%", start.toString(), end.toString()); + if (!start.isValid() || !end.isValid()) { + BUG("Invalid source position in SourceInfo %1%-%2% for %3%", start.toString(), + end.toString(), sources->toDebugString()); + } if (start > end) BUG("SourceInfo position start %1% after end %2%", start.toString(), end.toString()); } +SourceInfo::SourceInfo(const InputSources *sources, SourcePosition point) + : SourceInfo(sources, point, point) {} + +SourceInfo::SourceInfo(cstring filename, int line, int column, cstring srcBrief) { + this->filename = filename; + this->line = line; + this->column = column; + this->srcBrief = srcBrief; +} + cstring SourceInfo::toString() const { return absl::StrFormat("(%v)-(%v)", start.toString(), end.toString()); } diff --git a/lib/source_file.h b/lib/source_file.h index f10118d3eb2..7636ffd2640 100644 --- a/lib/source_file.h +++ b/lib/source_file.h @@ -135,18 +135,12 @@ class SourceInfo final { int line = -1; int column = -1; cstring srcBrief = ""_cs; - SourceInfo(cstring filename, int line, int column, cstring srcBrief) { - this->filename = filename; - this->line = line; - this->column = column; - this->srcBrief = srcBrief; - } + SourceInfo(cstring filename, int line, int column, cstring srcBrief); /// Creates an "invalid" SourceInfo SourceInfo() = default; /// Creates a SourceInfo for a 'point' in the source, or invalid - SourceInfo(const InputSources *sources, SourcePosition point) - : sources(sources), start(point), end(point) {} + SourceInfo(const InputSources *sources, SourcePosition point); SourceInfo(const InputSources *sources, SourcePosition start, SourcePosition end); diff --git a/tools/ir-generator/ir-generator.ypp b/tools/ir-generator/ir-generator.ypp index 3dd060bccbc..3e59052f1ec 100644 --- a/tools/ir-generator/ir-generator.ypp +++ b/tools/ir-generator/ir-generator.ypp @@ -39,9 +39,10 @@ limitations under the License. namespace P4 { #define YYLTYPE Util::SourceInfo -#define YYLLOC_DEFAULT(Cur, Rhs, N) \ - ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ - : Util::SourceInfo(sources, YYRHSLOC(Rhs, 0).getEnd())) +#define YYLLOC_DEFAULT(Cur, Rhs, N) \ + ((Cur) = (N) ? YYRHSLOC(Rhs, 1) + YYRHSLOC(Rhs, N) \ + : yylloc ? yyloc \ + : Util::SourceInfo(sources, sources->getCurrentPosition())) template void yyerror(const char *fmt, Args&&... args);