Cleanup some error messages.
This CL makes it clearer where errors are coming from and fixes the
source information on a few type determiner error messages.
Change-Id: I356518ac3004effe005bb7dea147c7fe442ab1a8
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/20063
Reviewed-by: David Neto <dneto@google.com>
diff --git a/samples/main.cc b/samples/main.cc
index ebc0c6d..fa58010 100644
--- a/samples/main.cc
+++ b/samples/main.cc
@@ -288,7 +288,7 @@
return 1;
}
if (!reader->Parse()) {
- std::cerr << reader->error() << std::endl;
+ std::cerr << "Parse: " << reader->error() << std::endl;
return 1;
}
@@ -307,13 +307,13 @@
tint::TypeDeterminer td(&ctx, &mod);
if (!td.Determine()) {
- std::cerr << td.error() << std::endl;
+ std::cerr << "Type Determination: " << td.error() << std::endl;
return 1;
}
tint::Validator v;
if (!v.Validate(mod)) {
- std::cerr << v.error() << std::endl;
+ std::cerr << "Validation: " << v.error() << std::endl;
return 1;
}
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index b732370..bad79f8 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -126,7 +126,8 @@
}
if (var->storage_class() != ast::StorageClass::kNone) {
- error_ = "function variable has a non-function storage class";
+ set_error(stmt->source(),
+ "function variable has a non-function storage class");
return false;
}
@@ -308,14 +309,16 @@
if (ident->has_path()) {
auto* imp = mod_->FindImportByName(ident->path());
if (imp == nullptr) {
- error_ = "Unable to find import for " + ident->name();
+ set_error(expr->source(), "Unable to find import for " + ident->name());
return false;
}
uint32_t ext_id = 0;
- auto* result_type =
- GetImportData(imp->path(), ident->name(), expr->params(), &ext_id);
+ auto* result_type = GetImportData(expr->source(), imp->path(),
+ ident->name(), expr->params(), &ext_id);
if (result_type == nullptr) {
+ set_error(expr->source(),
+ "Unable to determine result type for GLSL expression");
return false;
}
@@ -414,7 +417,8 @@
return true;
}
- set_error(expr->source(), "invalid type in member accessor");
+ set_error(expr->source(),
+ "invalid type " + data_type->type_name() + " in member accessor");
return false;
}
@@ -489,6 +493,7 @@
return true;
}
+ set_error(expr->source(), "Unknown binary expression");
return false;
}
@@ -573,6 +578,7 @@
}
ast::type::Type* TypeDeterminer::GetImportData(
+ const Source& source,
const std::string& path,
const std::string& name,
const ast::ExpressionList& params,
@@ -603,13 +609,14 @@
name == "sqrt" || name == "inversesqrt" || name == "normalize" ||
name == "length") {
if (params.size() != 1) {
- error_ = "incorrect number of parameters for " + name +
- ". Expected 1 got " + std::to_string(params.size());
+ set_error(source, "incorrect number of parameters for " + name +
+ ". Expected 1 got " +
+ std::to_string(params.size()));
return nullptr;
}
if (!params[0]->result_type()->is_float_scalar_or_vector()) {
- error_ = "incorrect type for " + name +
- ". Requires a float scalar or a float vector";
+ set_error(source, "incorrect type for " + name +
+ ". Requires a float scalar or a float vector");
return nullptr;
}
diff --git a/src/type_determiner.h b/src/type_determiner.h
index ca73c6c..770e00b 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -92,12 +92,14 @@
}
/// Retrieves information for the requested import.
+ /// @param src the source of the import
/// @param path the import path
/// @param name the method name to get information on
/// @param params the parameters to the method call
/// @param id out parameter for the external call ID. Must not be a nullptr.
/// @returns the return type of |name| in |path| or nullptr on error.
- ast::type::Type* GetImportData(const std::string& path,
+ ast::type::Type* GetImportData(const Source& src,
+ const std::string& path,
const std::string& name,
const ast::ExpressionList& params,
uint32_t* id);
diff --git a/src/type_determiner_test.cc b/src/type_determiner_test.cc
index d6ebdbf..b793110 100644
--- a/src/type_determiner_test.cc
+++ b/src/type_determiner_test.cc
@@ -1521,7 +1521,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_scalar());
EXPECT_EQ(id, param.value);
@@ -1548,7 +1549,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_vector());
EXPECT_EQ(type->AsVector()->size(), 3);
@@ -1567,7 +1569,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect type for ") + param.name +
". Requires a float scalar or a float vector");
@@ -1578,7 +1581,8 @@
ast::ExpressionList params;
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
param.name + ". Expected 1 got 0");
@@ -1599,7 +1603,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
param.name + ". Expected 1 got 3");
@@ -1648,7 +1653,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "length", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "length", params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_scalar());
EXPECT_EQ(id, GLSLstd450Length);
@@ -1673,7 +1679,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "length", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "length", params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_scalar());
EXPECT_EQ(id, GLSLstd450Length);
@@ -1689,7 +1696,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "length", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "length", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(
td()->error(),
@@ -1699,7 +1707,8 @@
TEST_F(TypeDeterminerTest, ImportData_Length_Error_NoParams) {
ast::ExpressionList params;
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "length", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "length", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect number of parameters for length. Expected 1 got 0");
@@ -1718,7 +1727,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "length", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "length", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect number of parameters for length. Expected 1 got 3");
@@ -1740,7 +1750,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_scalar());
EXPECT_EQ(id, param.value);
@@ -1777,7 +1788,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_vector());
EXPECT_EQ(type->AsVector()->size(), 3);
@@ -1798,7 +1810,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
std::string("incorrect type for ") + param.name +
@@ -1810,7 +1823,8 @@
ast::ExpressionList params;
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
param.name + ". Expected 2 got 0");
@@ -1827,7 +1841,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
param.name + ". Expected 2 got 1");
@@ -1863,7 +1878,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
std::string("mismatched parameter types for ") + param.name);
@@ -1892,7 +1908,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
std::string("mismatched parameter types for ") + param.name);
@@ -1913,7 +1930,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", param.name, params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", param.name, params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), std::string("incorrect number of parameters for ") +
param.name + ". Expected 2 got 3");
@@ -1942,7 +1960,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->is_float_scalar());
EXPECT_EQ(id, GLSLstd450Distance);
@@ -1977,7 +1996,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_NE(type, nullptr);
EXPECT_TRUE(type->IsF32());
EXPECT_EQ(id, GLSLstd450Distance);
@@ -1995,7 +2015,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect type for distance. Requires float scalar or a float "
@@ -2005,7 +2026,8 @@
TEST_F(TypeDeterminerTest, ImportData_Distance_Error_NoParams) {
ast::ExpressionList params;
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect number of parameters for distance. Expected 2 got 0");
@@ -2020,7 +2042,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect number of parameters for distance. Expected 2 got 1");
@@ -2054,7 +2077,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), "mismatched parameter types for distance");
}
@@ -2080,7 +2104,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(), "mismatched parameter types for distance");
}
@@ -2098,7 +2123,8 @@
ASSERT_TRUE(td()->DetermineResultType(params)) << td()->error();
uint32_t id = 0;
- auto* type = td()->GetImportData("GLSL.std.450", "distance", params, &id);
+ auto* type =
+ td()->GetImportData({0, 0}, "GLSL.std.450", "distance", params, &id);
ASSERT_EQ(type, nullptr);
EXPECT_EQ(td()->error(),
"incorrect number of parameters for distance. Expected 2 got 3");