Resolver: Clean up diagnostics
Don't have a separate diagnostic list, just put the errors straight into the ProgramBuilder's diagnostics.
This also fixes an issue where we were taking the stringified diagnostic list and creating a single error on resolution failure. This was the cause of the `error: error:` messages sometimes seen.
Also fix a stupid negated-logic bug around the "resolving failed, but no error was raised" ICE.
Change-Id: Iddf1f61e4be21137731dfc204210562abbf612b0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49963
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/program.cc b/src/program.cc
index 9029bb5..dff5616 100644
--- a/src/program.cc
+++ b/src/program.cc
@@ -45,7 +45,6 @@
if (builder.ResolveOnBuild() && builder.IsValid()) {
resolver::Resolver resolver(&builder);
if (!resolver.Resolve()) {
- diagnostics_.add_error(resolver.error());
is_valid_ = false;
}
}
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 9779c40..b46e4fe 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -124,7 +124,9 @@
} // namespace
Resolver::Resolver(ProgramBuilder* builder)
- : builder_(builder), intrinsic_table_(IntrinsicTable::Create()) {}
+ : builder_(builder),
+ diagnostics_(builder->Diagnostics()),
+ intrinsic_table_(IntrinsicTable::Create()) {}
Resolver::~Resolver() = default;
@@ -158,7 +160,7 @@
bool result = ResolveInternal();
- if (result && diagnostics_.contains_errors()) {
+ if (!result && !diagnostics_.contains_errors()) {
TINT_ICE(diagnostics_) << "resolving failed, but no error was raised";
return false;
}
diff --git a/src/resolver/resolver.h b/src/resolver/resolver.h
index 1780cb8..4426138 100644
--- a/src/resolver/resolver.h
+++ b/src/resolver/resolver.h
@@ -360,8 +360,8 @@
void Mark(const ast::Node* node);
ProgramBuilder* const builder_;
+ diag::List& diagnostics_;
std::unique_ptr<IntrinsicTable> const intrinsic_table_;
- diag::List diagnostics_;
BlockInfo* current_block_ = nullptr;
ScopeStack<VariableInfo*> variable_stack_;
std::unordered_map<Symbol, FunctionInfo*> symbol_to_function_;