[tint] Use TINT_ICE_ON_NO_MATCH
In all the places we currently ICE in the Default case.
Change-Id: I6937282b5252e6034b0d2f2a6bc78f0d565f59da
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/157320
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/core/constant/eval.cc b/src/tint/lang/core/constant/eval.cc
index 674b1a9..97e62d5 100644
--- a/src/tint/lang/core/constant/eval.cc
+++ b/src/tint/lang/core/constant/eval.cc
@@ -2788,11 +2788,7 @@
CreateScalar(source, mgr.types.AInt(), AInt(exp)),
};
},
- [&](Default) {
- TINT_ICE() << "unhandled element type for frexp() const-eval: "
- << s->Type()->FriendlyName();
- return FractExp{error, error};
- });
+ TINT_ICE_ON_NO_MATCH);
};
if (auto* vec = arg->Type()->As<core::type::Vector>()) {
diff --git a/src/tint/lang/core/constant/manager.cc b/src/tint/lang/core/constant/manager.cc
index 0ef1f37..ddd19d8 100644
--- a/src/tint/lang/core/constant/manager.cc
+++ b/src/tint/lang/core/constant/manager.cc
@@ -156,17 +156,14 @@
}
return Composite(s, std::move(zeros));
},
- [&](Default) -> const Value* {
- return Switch(
- type, //
- [&](const core::type::AbstractInt*) { return Get(AInt(0)); }, //
- [&](const core::type::AbstractFloat*) { return Get(AFloat(0)); }, //
- [&](const core::type::I32*) { return Get(i32(0)); }, //
- [&](const core::type::U32*) { return Get(u32(0)); }, //
- [&](const core::type::F32*) { return Get(f32(0)); }, //
- [&](const core::type::F16*) { return Get(f16(0)); }, //
- [&](const core::type::Bool*) { return Get(false); });
- });
+ [&](const core::type::AbstractInt*) { return Get(AInt(0)); }, //
+ [&](const core::type::AbstractFloat*) { return Get(AFloat(0)); }, //
+ [&](const core::type::I32*) { return Get(i32(0)); }, //
+ [&](const core::type::U32*) { return Get(u32(0)); }, //
+ [&](const core::type::F32*) { return Get(f32(0)); }, //
+ [&](const core::type::F16*) { return Get(f16(0)); }, //
+ [&](const core::type::Bool*) { return Get(false); }, //
+ TINT_ICE_ON_NO_MATCH);
}
} // namespace tint::core::constant
diff --git a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
index 7658d0b..5d81e6b 100644
--- a/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
+++ b/src/tint/lang/core/ir/transform/bgra8unorm_polyfill.cc
@@ -174,9 +174,7 @@
// Just replace arguments to user functions and then stop.
call->SetOperand(use.operand_index, new_value);
},
- [&](Default) {
- TINT_ICE() << "unhandled instruction " << use.instruction->FriendlyName();
- });
+ TINT_ICE_ON_NO_MATCH);
});
}
};
diff --git a/src/tint/lang/core/ir/transform/direct_variable_access.cc b/src/tint/lang/core/ir/transform/direct_variable_access.cc
index 119ee28..a13d1b9 100644
--- a/src/tint/lang/core/ir/transform/direct_variable_access.cc
+++ b/src/tint/lang/core/ir/transform/direct_variable_access.cc
@@ -471,24 +471,16 @@
chain.root_ptr = var->Result();
return nullptr;
},
- [&](Let* let) { return let->Value(); },
- [&](Default) {
- TINT_ICE() << "unhandled instruction type: "
- << (inst ? inst->TypeInfo().name : "<null>");
- return nullptr;
- });
+ [&](Let* let) { return let->Value(); }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](FunctionParam* param) {
// Root pointer is a parameter of the caller
chain.shape.root = RootPtrParameter{param->Type()->As<type::Pointer>()};
chain.root_ptr = param;
return nullptr;
- },
- [&](Default) {
- TINT_ICE() << "unhandled value type: "
- << (value ? value->TypeInfo().name : "<null>");
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
// Reverse the chain's ops and indices. See above for why.
diff --git a/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc b/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
index f59c2bd..7766c59 100644
--- a/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
+++ b/src/tint/lang/core/ir/transform/multiplanar_external_texture.cc
@@ -260,10 +260,8 @@
}
}
call->SetOperands(std::move(operands));
- },
- [&](Default) {
- TINT_ICE() << "unhandled instruction " << use.instruction->FriendlyName();
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
});
}
diff --git a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc
index 0393fc8..927844b 100644
--- a/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc
+++ b/src/tint/lang/core/ir/transform/zero_init_workgroup_memory.cc
@@ -262,8 +262,8 @@
new_indices.Push(member->Index());
PrepareStores(var, member->Type(), iteration_count, new_indices, stores);
}
- },
- [&](Default) { TINT_UNREACHABLE(); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Get or inject an entry point builtin for the local invocation index.
diff --git a/src/tint/lang/core/type/builtin_structs.cc b/src/tint/lang/core/type/builtin_structs.cc
index 09c4587..8f319d5 100644
--- a/src/tint/lang/core/type/builtin_structs.cc
+++ b/src/tint/lang/core/type/builtin_structs.cc
@@ -98,16 +98,10 @@
build(kModfVecF16Names[width - 2], types.vec(types.f16(), width)),
});
return abstract;
- },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled modf type";
- return nullptr;
- });
- },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled modf type";
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// An array of `frexp()` return type names for an argument of `vecN<f32>`.
@@ -170,16 +164,10 @@
build(kFrexpVecF16Names[width - 2], vec_f16, vec_i32),
});
return abstract;
- },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled frexp type";
- return nullptr;
- });
- },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled frexp type";
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
Struct* CreateAtomicCompareExchangeResult(Manager& types, SymbolTable& symbols, const Type* ty) {
@@ -194,10 +182,7 @@
ty, //
[&](const I32*) { return build(core::BuiltinType::kAtomicCompareExchangeResultI32); },
[&](const U32*) { return build(core::BuiltinType::kAtomicCompareExchangeResultU32); },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled atomic_compare_exchange type";
- return nullptr;
- });
+ TINT_ICE_ON_NO_MATCH);
}
} // namespace tint::core::type
diff --git a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
index fc9a7ed..cec5d7e 100644
--- a/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/glsl/writer/ast_printer/ast_printer.cc
@@ -318,10 +318,8 @@
[&](const ast::Enable* enable) {
// Record the required extension for generating extension directive later
RecordExtension(enable);
- },
- [&](Default) {
- TINT_ICE() << "unhandled module-scope declaration: " << decl->TypeInfo().name;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
TextBuffer extensions;
@@ -806,9 +804,7 @@
[&](const sem::BuiltinFn* builtin) { EmitBuiltinCall(out, call, builtin); },
[&](const sem::ValueConversion* conv) { EmitValueConversion(out, call, conv); },
[&](const sem::ValueConstructor* ctor) { EmitValueConstructor(out, call, ctor); },
- [&](Default) {
- TINT_ICE() << "unhandled call target: " << call->Target()->TypeInfo().name;
- });
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitFunctionCall(StringStream& out,
@@ -1795,11 +1791,8 @@
[&](const ast::IdentifierExpression* i) { EmitIdentifier(out, i); },
[&](const ast::LiteralExpression* l) { EmitLiteral(out, l); },
[&](const ast::MemberAccessorExpression* m) { EmitMemberAccessor(out, m); },
- [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(out, u); },
- [&](Default) { //
- diagnostics_.add_error(diag::System::Writer, "unknown expression type: " +
- std::string(expr->TypeInfo().name));
- });
+ [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(out, u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitIdentifier(StringStream& out, const ast::IdentifierExpression* expr) {
@@ -1922,10 +1915,8 @@
},
[&](const ast::Const*) {
// Constants are embedded at their use
- },
- [&](Default) {
- TINT_ICE() << "unhandled global variable type " << global->TypeInfo().name;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitUniformVariable(const ast::Var* var, const sem::Variable* sem) {
@@ -2307,11 +2298,8 @@
}
EmitConstant(out, constant->Index(i));
}
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unhandled constant type: " + constant->Type()->FriendlyName());
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitLiteral(StringStream& out, const ast::LiteralExpression* lit) {
@@ -2338,8 +2326,8 @@
}
}
diagnostics_.add_error(diag::System::Writer, "unknown integer literal suffix type");
- },
- [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown literal type"); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitZeroValue(StringStream& out, const core::type::Type* type) {
@@ -2571,8 +2559,8 @@
},
[&](const sem::StructMemberAccess* member_access) {
out << member_access->Member()->Name().Name();
- },
- [&](Default) { TINT_ICE() << "unknown member access type: " << sem->TypeInfo().name; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitReturn(const ast::ReturnStatement* stmt) {
@@ -2613,18 +2601,13 @@
[&](const ast::Let* let) { EmitLet(let); },
[&](const ast::Const*) {
// Constants are embedded at their use
- },
- [&](Default) { //
- TINT_ICE() << "unknown variable type: " << v->variable->TypeInfo().name;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](const ast::ConstAssert*) {
// Not emitted
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitSwitch(const ast::SwitchStatement* stmt) {
diff --git a/src/tint/lang/glsl/writer/ast_raise/texture_builtins_from_uniform.cc b/src/tint/lang/glsl/writer/ast_raise/texture_builtins_from_uniform.cc
index 644a0a5..67eb338 100644
--- a/src/tint/lang/glsl/writer/ast_raise/texture_builtins_from_uniform.cc
+++ b/src/tint/lang/glsl/writer/ast_raise/texture_builtins_from_uniform.cc
@@ -160,10 +160,8 @@
GetAndRecordFunctionParameter(fn, variable, dataType);
// Record the call and new_param to be replaced later.
builtin_to_replace.Add(call_expr, new_param);
- },
- [&](Default) {
- TINT_ICE() << "unexpected texture root identifier";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](const sem::Function* user_fn) {
auto user_param_to_info = fn_to_data.Find(user_fn);
@@ -200,10 +198,8 @@
fn, variable, info->field);
// Record adding extra function parameter
args.Push(new_param);
- },
- [&](Default) {
- TINT_ICE() << "unexpected texture root identifier";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
}
});
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index ed65648..f3dda8c 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -45,11 +45,6 @@
namespace tint::glsl::writer {
namespace {
-// Helper for calling TINT_UNIMPLEMENTED() from a Switch(object_ptr) default case.
-#define UNHANDLED_CASE(object_ptr) \
- TINT_UNIMPLEMENTED() << "unhandled case in Switch(): " \
- << (object_ptr ? object_ptr->TypeInfo().name : "<null>")
-
/// PIMPL class for the MSL generator
class Printer : public tint::TextGenerator {
public:
@@ -142,7 +137,7 @@
inst, //
[&](core::ir::Return* r) { EmitReturn(r); }, //
[&](core::ir::Unreachable*) { EmitUnreachable(); }, //
- [&](Default) { UNHANDLED_CASE(inst); });
+ TINT_ICE_ON_NO_MATCH);
}
}
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 6ba1dc1..51f49b0 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -411,11 +411,8 @@
return EmitEntryPointFunction(func);
}
return EmitFunction(func);
- },
- [&](Default) {
- TINT_ICE() << "unhandled module-scope declaration: " << decl->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
@@ -1106,10 +1103,7 @@
[&](const sem::BuiltinFn* builtin) { return EmitBuiltinCall(out, call, builtin); },
[&](const sem::ValueConversion* conv) { return EmitValueConversion(out, call, conv); },
[&](const sem::ValueConstructor* ctor) { return EmitValueConstructor(out, call, ctor); },
- [&](Default) {
- TINT_ICE() << "unhandled call target: " << target->TypeInfo().name;
- return false;
- });
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitFunctionCall(StringStream& out,
@@ -3119,12 +3113,8 @@
[&](const ast::IdentifierExpression* i) { return EmitIdentifier(out, i); },
[&](const ast::LiteralExpression* l) { return EmitLiteral(out, l); },
[&](const ast::MemberAccessorExpression* m) { return EmitMemberAccessor(out, m); },
- [&](const ast::UnaryOpExpression* u) { return EmitUnaryOp(out, u); },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer, "unknown expression type: " +
- std::string(expr->TypeInfo().name));
- return false;
- });
+ [&](const ast::UnaryOpExpression* u) { return EmitUnaryOp(out, u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitIdentifier(StringStream& out, const ast::IdentifierExpression* expr) {
@@ -3335,12 +3325,8 @@
},
[&](const ast::Const*) {
return true; // Constants are embedded at their use
- },
- [&](Default) {
- TINT_ICE() << "unhandled global variable type " << global->TypeInfo().name;
-
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitUniformVariable(const ast::Var* var, const sem::Variable* sem) {
@@ -3756,12 +3742,8 @@
}
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unhandled constant type: " + constant->Type()->FriendlyName());
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitLiteral(StringStream& out, const ast::LiteralExpression* lit) {
@@ -3793,11 +3775,8 @@
}
diagnostics_.add_error(diag::System::Writer, "unknown integer literal suffix type");
return false;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer, "unknown literal type");
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitValue(StringStream& out, const core::type::Type* type, int value) {
@@ -3866,12 +3845,8 @@
TINT_DEFER(out << ")" << value);
return EmitType(out, type, core::AddressSpace::kUndefined, core::Access::kUndefined,
"");
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "Invalid type for value emission: " + type->FriendlyName());
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitZeroValue(StringStream& out, const core::type::Type* type) {
@@ -4081,11 +4056,8 @@
[&](const sem::StructMemberAccess* member_access) {
out << member_access->Member()->Name().Name();
return true;
- },
- [&](Default) {
- TINT_ICE() << "unknown member access type: " << sem->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitReturn(const ast::ReturnStatement* stmt) {
@@ -4156,20 +4128,13 @@
[&](const ast::Let* let) { return EmitLet(let); },
[&](const ast::Const*) {
return true; // Constants are embedded at their use
- },
- [&](Default) { //
- TINT_ICE() << "unknown variable type: " << v->variable->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](const ast::ConstAssert*) {
return true; // Not emitted
- },
- [&](Default) { //
- diagnostics_.add_error(diag::System::Writer,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitDefaultOnlySwitch(const ast::SwitchStatement* stmt) {
@@ -4450,11 +4415,8 @@
[&](const core::type::Void*) {
out << "void";
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer, "unknown type in EmitType");
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitTypeAndName(StringStream& out,
diff --git a/src/tint/lang/hlsl/writer/ast_raise/localize_struct_array_assignment.cc b/src/tint/lang/hlsl/writer/ast_raise/localize_struct_array_assignment.cc
index d4042f1..c52041d 100644
--- a/src/tint/lang/hlsl/writer/ast_raise/localize_struct_array_assignment.cc
+++ b/src/tint/lang/hlsl/writer/ast_raise/localize_struct_array_assignment.cc
@@ -215,12 +215,8 @@
},
[&](const core::type::Pointer* ptr) {
return std::make_pair(ptr->StoreType(), ptr->AddressSpace());
- },
- [&](Default) {
- TINT_ICE() << "Expecting to find variable of type pointer or reference on lhs "
- "of assignment statement";
- return std::pair<const core::type::Type*, core::AddressSpace>{};
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
};
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index 0149f74..69a4f31 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -327,12 +327,8 @@
},
[&](const ast::ConstAssert*) {
return true; // Not emitted
- },
- [&](Default) {
- // These are pushed into the entry point by sanitizer transforms.
- TINT_ICE() << "unhandled type: " << decl->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
}
@@ -641,14 +637,12 @@
auto* call = builder_.Sem().Get<sem::Call>(expr);
auto* target = call->Target();
return Switch(
- target, [&](const sem::Function* func) { return EmitFunctionCall(out, call, func); },
+ target, //
+ [&](const sem::Function* func) { return EmitFunctionCall(out, call, func); },
[&](const sem::BuiltinFn* builtin) { return EmitBuiltinCall(out, call, builtin); },
[&](const sem::ValueConversion* conv) { return EmitTypeConversion(out, call, conv); },
- [&](const sem::ValueConstructor* ctor) { return EmitTypeInitializer(out, call, ctor); },
- [&](Default) {
- TINT_ICE() << "unhandled call target: " << target->TypeInfo().name;
- return false;
- });
+ [&](const sem::ValueConstructor* ctor) { return EmitTypeInitializer(out, call, ctor); }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitFunctionCall(StringStream& out,
@@ -1718,12 +1712,8 @@
[&](const core::type::Struct*) {
out << "{}";
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "Invalid type for zero emission: " + type->FriendlyName());
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitConstant(StringStream& out, const core::constant::Value* constant) {
@@ -1844,12 +1834,8 @@
}
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unhandled constant type: " + constant->Type()->FriendlyName());
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitLiteral(StringStream& out, const ast::LiteralExpression* lit) {
@@ -1881,11 +1867,8 @@
}
diagnostics_.add_error(diag::System::Writer, "unknown integer literal suffix type");
return false;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer, "unknown literal type");
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitExpression(StringStream& out, const ast::Expression* expr) {
@@ -1903,12 +1886,8 @@
[&](const ast::IdentifierExpression* i) { return EmitIdentifier(out, i); },
[&](const ast::LiteralExpression* l) { return EmitLiteral(out, l); },
[&](const ast::MemberAccessorExpression* m) { return EmitMemberAccessor(out, m); },
- [&](const ast::UnaryOpExpression* u) { return EmitUnaryOp(out, u); },
- [&](Default) { //
- diagnostics_.add_error(diag::System::Writer, "unknown expression type: " +
- std::string(expr->TypeInfo().name));
- return false;
- });
+ [&](const ast::UnaryOpExpression* u) { return EmitUnaryOp(out, u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitStage(StringStream& out, ast::PipelineStage stage) {
@@ -2404,11 +2383,8 @@
}
out << "." << member_access->Member()->Name().Name();
return true;
- },
- [&](Default) {
- TINT_ICE() << "unknown member access type: " << sem->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitReturn(const ast::ReturnStatement* stmt) {
@@ -2490,20 +2466,13 @@
[&](const ast::Let* let) { return EmitLet(let); },
[&](const ast::Const*) {
return true; // Constants are embedded at their use
- },
- [&](Default) { //
- TINT_ICE() << "unknown statement type: " << stmt->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](const ast::ConstAssert*) {
return true; // Not emitted
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitStatements(VectorRef<const ast::Statement*> stmts) {
@@ -2711,11 +2680,8 @@
}
out << ", access::sample";
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer, "invalid texture type");
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
},
[&](const core::type::U32*) {
out << "uint";
@@ -2734,12 +2700,8 @@
[&](const core::type::Void*) {
out << "void";
return true;
- },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown type in EmitType: " + type->FriendlyName());
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool ASTPrinter::EmitTypeAndName(StringStream& out,
diff --git a/src/tint/lang/msl/writer/common/printer_support.cc b/src/tint/lang/msl/writer/common/printer_support.cc
index f11a27e..d9e74c4 100644
--- a/src/tint/lang/msl/writer/common/printer_support.cc
+++ b/src/tint/lang/msl/writer/common/printer_support.cc
@@ -224,10 +224,7 @@
[&](const core::type::Atomic* atomic) { return MslPackedTypeSizeAndAlign(atomic->Type()); },
- [&](Default) {
- TINT_UNREACHABLE() << "Unhandled type " << ty->TypeInfo().name;
- return SizeAndAlign{};
- });
+ TINT_ICE_ON_NO_MATCH);
}
void PrintF32(StringStream& out, float value) {
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index adaa72f..02fb9c5 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -76,11 +76,6 @@
namespace tint::msl::writer {
namespace {
-// Helper for calling TINT_UNIMPLEMENTED() from a Switch(object_ptr) default case.
-#define UNHANDLED_CASE(object_ptr) \
- TINT_UNIMPLEMENTED() << "unhandled case in Switch(): " \
- << (object_ptr ? object_ptr->TypeInfo().name : "<null>")
-
/// PIMPL class for the MSL generator
class Printer : public tint::TextGenerator {
public:
@@ -247,9 +242,7 @@
[&](core::ir::Return* r) { EmitReturn(r); }, //
[&](core::ir::Unreachable*) { EmitUnreachable(); }, //
[&](core::ir::Var* v) { EmitVar(v); }, //
- [&](Default) {
- TINT_ICE() << "unimplemented instruction: " << inst->TypeInfo().name;
- });
+ TINT_ICE_ON_NO_MATCH);
}
}
@@ -482,8 +475,8 @@
TINT_SCOPED_ASSIGNMENT(current_buffer_, &preamble_buffer_);
EmitStructType(str);
- },
- [&](Default) { UNHANDLED_CASE(ty); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Handles generating a pointer declaration
@@ -622,8 +615,8 @@
[&](const core::type::SampledTexture* sampled) {
EmitType(out, sampled->type());
out << ", access::sample";
- },
- [&](Default) { TINT_ICE() << "invalid texture type"; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Handles generating a struct declaration. If the structure has already been emitted, then
@@ -840,8 +833,8 @@
out << "." << members[i]->Name().Name() << "=";
EmitConstant(out, c->Index(i));
}
- },
- [&](Default) { UNHANDLED_CASE(c->Type()); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Emits the zero value for the given type
@@ -863,9 +856,7 @@
},
[&](const core::type::Array*) { out << "{}"; }, //
[&](const core::type::Struct*) { out << "{}"; }, //
- [&](Default) {
- TINT_ICE() << "Invalid type for zero emission: " << ty->FriendlyName();
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// @param s the structure
diff --git a/src/tint/lang/spirv/reader/ast_lower/atomics.cc b/src/tint/lang/spirv/reader/ast_lower/atomics.cc
index 09b5fe6..fa1f371 100644
--- a/src/tint/lang/spirv/reader/ast_lower/atomics.cc
+++ b/src/tint/lang/spirv/reader/ast_lower/atomics.cc
@@ -236,11 +236,8 @@
return b.ty.ptr(ptr->AddressSpace(), AtomicTypeFor(ptr->StoreType()),
ptr->Access());
},
- [&](const core::type::Reference* ref) { return AtomicTypeFor(ref->StoreType()); },
- [&](Default) {
- TINT_ICE() << "unhandled type: " << ty->FriendlyName();
- return ast::Type{};
- });
+ [&](const core::type::Reference* ref) { return AtomicTypeFor(ref->StoreType()); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ReplaceLoadsAndStores() {
diff --git a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
index 4875d2c..2c7d268 100644
--- a/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/ast_parser.cc
@@ -2054,11 +2054,8 @@
const bool value =
spirv_const->AsNullConstant() ? false : spirv_const->AsBoolConstant()->value();
return TypedExpression{ty_.Bool(), create<ast::BoolLiteralExpression>(source, value)};
- },
- [&](Default) {
- Fail() << "expected scalar constant";
- return TypedExpression{};
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
const ast::Expression* ASTParser::MakeNullValue(const Type* type) {
@@ -2100,11 +2097,8 @@
}
return builder_.Call(Source{}, original_type->Build(builder_),
std::move(ast_components));
- },
- [&](Default) {
- Fail() << "can't make null value for type: " << type->TypeInfo().name;
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
TypedExpression ASTParser::MakeNullExpression(const Type* type) {
diff --git a/src/tint/lang/spirv/reader/ast_parser/helper_test.cc b/src/tint/lang/spirv/reader/ast_parser/helper_test.cc
index e0a5cd2..a417c51 100644
--- a/src/tint/lang/spirv/reader/ast_parser/helper_test.cc
+++ b/src/tint/lang/spirv/reader/ast_parser/helper_test.cc
@@ -88,10 +88,8 @@
}
return writer.Result();
},
- [&](const ast::Identifier* ident) { return ident->symbol.Name(); },
- [&](Default) {
- return "<unhandled AST node type " + std::string(node->TypeInfo().name) + ">";
- });
+ [&](const ast::Identifier* ident) { return ident->symbol.Name(); }, //
+ TINT_ICE_ON_NO_MATCH);
}
} // namespace tint::spirv::reader::ast_parser::test
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index ee22481..734c380 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -541,11 +541,8 @@
[&](const ast::CallExpression* c) { return GenerateCallExpression(c); },
[&](const ast::IdentifierExpression* i) { return GenerateIdentifierExpression(i); },
[&](const ast::LiteralExpression* l) { return GenerateLiteralIfNeeded(l); },
- [&](const ast::UnaryOpExpression* u) { return GenerateUnaryOpExpression(u); },
- [&](Default) {
- TINT_ICE() << "unknown expression type: " + std::string(expr->TypeInfo().name);
- return 0;
- });
+ [&](const ast::UnaryOpExpression* u) { return GenerateUnaryOpExpression(u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
uint32_t Builder::GenerateExpression(const ast::Expression* expr) {
@@ -858,11 +855,8 @@
},
[&](const ast::InternalAttribute*) {
return true; // ignored
- },
- [&](Default) {
- TINT_ICE() << "unknown attribute";
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
}
@@ -1049,11 +1043,8 @@
info->source_id = result_id;
info->source_type = expr_type;
return true;
- },
- [&](Default) {
- TINT_ICE() << "unhandled member index type: " << expr_sem->TypeInfo().name;
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
uint32_t Builder::GenerateAccessorExpression(const ast::AccessorExpression* expr) {
@@ -1097,11 +1088,8 @@
},
[&](const ast::MemberAccessorExpression* member) {
return GenerateMemberAccessor(member, &info);
- },
- [&](Default) {
- TINT_ICE() << "invalid accessor in list: " + std::string(accessor->TypeInfo().name);
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
}
@@ -1620,8 +1608,8 @@
constant.value.f16 = {f16(static_cast<float>(f->value)).BitsRepresentation()};
return;
}
- },
- [&](Default) { TINT_ICE() << "unknown literal type"; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (has_error()) {
return false;
@@ -1699,11 +1687,8 @@
}
return composite(count.value());
},
- [&](const core::type::Struct* s) { return composite(s->Members().Length()); },
- [&](Default) {
- TINT_ICE() << "unhandled constant type: " + ty->FriendlyName();
- return 0;
- });
+ [&](const core::type::Struct* s) { return composite(s->Members().Length()); }, //
+ TINT_ICE_ON_NO_MATCH);
}
uint32_t Builder::GenerateConstantIfNeeded(const ScalarConstant& constant) {
@@ -2232,11 +2217,8 @@
},
[&](const sem::ValueConstructor*) {
return GenerateValueConstructorOrConversion(call, nullptr);
- },
- [&](Default) {
- TINT_ICE() << "unhandled call target: " << target->TypeInfo().name;
- return 0;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
uint32_t Builder::GenerateFunctionCall(const sem::Call* call, const sem::Function* fn) {
@@ -3639,11 +3621,8 @@
[&](const ast::VariableDeclStatement* v) { return GenerateVariableDeclStatement(v); },
[&](const ast::ConstAssert*) {
return true; // Not emitted
- },
- [&](Default) {
- TINT_ICE() << "unknown statement type: " + std::string(stmt->TypeInfo().name);
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
bool Builder::GenerateVariableDeclStatement(const ast::VariableDeclStatement* stmt) {
@@ -3767,11 +3746,8 @@
core::type::SamplerKind::kSampler)] = id;
}
return true;
- },
- [&](Default) {
- TINT_ICE() << "unable to convert type: " + type->FriendlyName();
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return 0;
@@ -3843,8 +3819,8 @@
},
[&](const core::type::SampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
[&](const core::type::MultisampledTexture* t) { return GenerateTypeIfNeeded(t->type()); },
- [&](const core::type::StorageTexture* t) { return GenerateTypeIfNeeded(t->type()); },
- [&](Default) { return 0u; });
+ [&](const core::type::StorageTexture* t) { return GenerateTypeIfNeeded(t->type()); }, //
+ TINT_ICE_ON_NO_MATCH);
if (type_id == 0u) {
return false;
}
diff --git a/src/tint/lang/spirv/writer/ast_raise/merge_return.cc b/src/tint/lang/spirv/writer/ast_raise/merge_return.cc
index b36faea..07216c4 100644
--- a/src/tint/lang/spirv/writer/ast_raise/merge_return.cc
+++ b/src/tint/lang/spirv/writer/ast_raise/merge_return.cc
@@ -154,8 +154,8 @@
[&](const ast::WhileStatement* w) {
TINT_SCOPED_ASSIGNMENT(is_in_loop_or_switch, true);
ProcessStatement(w->body);
- },
- [&](Default) { TINT_ICE() << "unhandled statement type"; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ProcessBlock(const ast::BlockStatement* block) {
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index ec01f85..a7c86b8 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -445,8 +445,8 @@
operands.push_back(Constant(constant->Index(i)));
}
module_.PushType(spv::Op::OpConstantComposite, operands);
- },
- [&](Default) { TINT_ICE() << "unhandled constant type: " << ty->FriendlyName(); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
return id;
});
}
@@ -529,8 +529,8 @@
[&](const core::type::Sampler*) { module_.PushType(spv::Op::OpTypeSampler, {id}); },
[&](const type::SampledImage* s) {
module_.PushType(spv::Op::OpTypeSampledImage, {id, Type(s->Image())});
- },
- [&](Default) { TINT_ICE() << "unhandled type: " << ty->FriendlyName(); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
return id;
});
}
@@ -616,11 +616,8 @@
texture, //
[&](const core::type::SampledTexture* t) { return Type(t->type()); },
[&](const core::type::MultisampledTexture* t) { return Type(t->type()); },
- [&](const core::type::StorageTexture* t) { return Type(t->type()); },
- [&](Default) {
- TINT_ICE() << "unhandled texture type: " << texture->TypeInfo().name;
- return 0u;
- });
+ [&](const core::type::StorageTexture* t) { return Type(t->type()); }, //
+ TINT_ICE_ON_NO_MATCH);
uint32_t dim = SpvDimMax;
uint32_t array = 0u;
@@ -822,11 +819,9 @@
void EmitRootBlock(core::ir::Block* root_block) {
for (auto* inst : *root_block) {
Switch(
- inst, //
- [&](core::ir::Var* v) { return EmitVar(v); },
- [&](Default) {
- TINT_ICE() << "unimplemented root block instruction: " << inst->TypeInfo().name;
- });
+ inst, //
+ [&](core::ir::Var* v) { return EmitVar(v); }, //
+ TINT_ICE_ON_NO_MATCH);
}
}
@@ -899,9 +894,7 @@
[&](core::ir::Let* l) { EmitLet(l); }, //
[&](core::ir::If* i) { EmitIf(i); }, //
[&](core::ir::Terminator* t) { EmitTerminator(t); }, //
- [&](Default) {
- TINT_ICE() << "unimplemented instruction: " << inst->TypeInfo().name;
- });
+ TINT_ICE_ON_NO_MATCH);
// Set the name for the SPIR-V result ID if provided in the module.
if (inst->Result() && !inst->Is<core::ir::Var>()) {
@@ -961,9 +954,8 @@
},
[&](core::ir::Unreachable*) {
current_function_.push_inst(spv::Op::OpUnreachable, {});
- },
-
- [&](Default) { TINT_ICE() << "unimplemented branch: " << t->TypeInfo().name; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Emit an `if` flow node.
diff --git a/src/tint/lang/wgsl/ast/module.cc b/src/tint/lang/wgsl/ast/module.cc
index 55e6142..3ee8cfd 100644
--- a/src/tint/lang/wgsl/ast/module.cc
+++ b/src/tint/lang/wgsl/ast/module.cc
@@ -92,8 +92,8 @@
[&](const ConstAssert* assertion) {
TINT_ASSERT_GENERATION_IDS_EQUAL_IF_VALID(assertion, generation_id);
const_asserts_.Push(assertion);
- },
- [&](Default) { TINT_ICE() << "Unknown global declaration type"; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void Module::AddDiagnosticDirective(const DiagnosticDirective* directive) {
diff --git a/src/tint/lang/wgsl/ast/transform/get_insertion_point.cc b/src/tint/lang/wgsl/ast/transform/get_insertion_point.cc
index 31729ef..4f0d9c7 100644
--- a/src/tint/lang/wgsl/ast/transform/get_insertion_point.cc
+++ b/src/tint/lang/wgsl/ast/transform/get_insertion_point.cc
@@ -58,12 +58,8 @@
// Cannot insert before or after continuing statement of a for-loop
return {};
- },
- [&](Default) -> RetType {
- TINT_ICE() << "expected parent of statement to be "
- "either a block or for loop";
- return {};
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
return {};
diff --git a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
index c61abdd..39ebb2d 100644
--- a/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
+++ b/src/tint/lang/wgsl/ast/transform/preserve_padding.cc
@@ -187,11 +187,8 @@
}
return body;
});
- },
- [&](Default) {
- TINT_ICE() << "unhandled type with padding";
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Checks if a type contains padding bytes.
diff --git a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
index 1c7bc25..8f2a7d8 100644
--- a/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
+++ b/src/tint/lang/wgsl/ast/transform/promote_side_effects_to_decl.cc
@@ -180,11 +180,8 @@
[&](const PhonyExpression* e) {
no_side_effects.insert(e);
return false;
- },
- [&](Default) {
- TINT_ICE() << "Unhandled expression type";
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
// Adds `e` to `to_hoist` for hoisting to a let later on.
@@ -344,11 +341,8 @@
[&](const PhonyExpression*) {
// Leaf
return false;
- },
- [&](Default) {
- TINT_ICE() << "Unhandled expression type";
- return false;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
// Starts the recursive processing of a statement's expression(s) to hoist side-effects to lets.
@@ -527,11 +521,8 @@
},
[&](const PhonyExpression* phony) {
return clone_maybe_hoisted(phony); // Leaf expression, just clone as is
- },
- [&](Default) {
- TINT_ICE() << "unhandled expression type: " << expr->TypeInfo().name;
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
// Inserts statements in `stmts` before `stmt`
diff --git a/src/tint/lang/wgsl/ast/transform/robustness.cc b/src/tint/lang/wgsl/ast/transform/robustness.cc
index 84c40ed..c984b29 100644
--- a/src/tint/lang/wgsl/ast/transform/robustness.cc
+++ b/src/tint/lang/wgsl/ast/transform/robustness.cc
@@ -274,12 +274,8 @@
b.Diagnostics().add_error(diag::System::Transform,
core::type::Array::kErrExpectedConstantCount);
return nullptr;
- },
- [&](Default) -> const Expression* {
- TINT_ICE() << "unhandled object type in robustness of array index: "
- << obj_type->UnwrapRef()->FriendlyName();
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Transform the program to insert additional predicate parameters to all user functions that
diff --git a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
index 2fa12be..44e4b86 100644
--- a/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
+++ b/src/tint/lang/wgsl/ast/transform/single_entry_point.cc
@@ -128,10 +128,8 @@
}
},
[&](const Enable* ext) { b.AST().AddEnable(ctx.Clone(ext)); },
- [&](const DiagnosticDirective* d) { b.AST().AddDiagnosticDirective(ctx.Clone(d)); },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled global declaration: " << decl->TypeInfo().name;
- });
+ [&](const DiagnosticDirective* d) { b.AST().AddDiagnosticDirective(ctx.Clone(d)); }, //
+ TINT_ICE_ON_NO_MATCH);
}
// Clone the entry point.
diff --git a/src/tint/lang/wgsl/ast/transform/std140.cc b/src/tint/lang/wgsl/ast/transform/std140.cc
index f81b507..d933ec6 100644
--- a/src/tint/lang/wgsl/ast/transform/std140.cc
+++ b/src/tint/lang/wgsl/ast/transform/std140.cc
@@ -644,11 +644,8 @@
"_" + ConvertSuffix(mat->type());
},
[&](const core::type::F32*) { return "f32"; }, //
- [&](const core::type::F16*) { return "f16"; },
- [&](Default) {
- TINT_ICE() << "unhandled type for conversion name: " << ty->FriendlyName();
- return "";
- });
+ [&](const core::type::F16*) { return "f16"; }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Generates and returns an expression that loads the value from a std140 uniform buffer,
@@ -748,10 +745,8 @@
b.Assign(i, b.Add(i, 1_a)), //
b.Block(b.Assign(dst_el, src_el))));
stmts.Push(b.Return(var));
- },
- [&](Default) {
- TINT_ICE() << "unhandled type for conversion: " << ty->FriendlyName();
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
// Generate the function
auto ret_ty = CreateASTTypeFor(ctx, ty);
@@ -1094,10 +1089,7 @@
auto* expr = b.IndexAccessor(lhs, idx);
return {expr, vec->type(), name};
}, //
- [&](Default) -> ExprTypeName {
- TINT_ICE() << "unhandled type for access chain: " << ty->FriendlyName();
- return {};
- });
+ TINT_ICE_ON_NO_MATCH);
}
if (auto* swizzle = std::get_if<Swizzle>(&access)) {
/// The access is a vector swizzle.
@@ -1114,10 +1106,7 @@
auto* expr = b.MemberAccessor(lhs, rhs);
return {expr, swizzle_ty, rhs};
}, //
- [&](Default) -> ExprTypeName {
- TINT_ICE() << "unhandled type for access chain: " << ty->FriendlyName();
- return {};
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// The access is a static index.
auto idx = std::get<u32>(access);
@@ -1142,10 +1131,7 @@
auto* expr = b.IndexAccessor(lhs, idx);
return {expr, vec->type(), std::to_string(idx)};
}, //
- [&](Default) -> ExprTypeName {
- TINT_ICE() << "unhandled type for access chain: " << ty->FriendlyName();
- return {};
- });
+ TINT_ICE_ON_NO_MATCH);
}
};
diff --git a/src/tint/lang/wgsl/ast/transform/unshadow.cc b/src/tint/lang/wgsl/ast/transform/unshadow.cc
index e2c4fce..eab34b0 100644
--- a/src/tint/lang/wgsl/ast/transform/unshadow.cc
+++ b/src/tint/lang/wgsl/ast/transform/unshadow.cc
@@ -87,11 +87,8 @@
},
[&](const Parameter*) { //
return b.Param(source, symbol, type, attributes);
- },
- [&](Default) {
- TINT_ICE() << "unexpected variable type: " << decl->TypeInfo().name;
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
};
bool made_changes = false;
diff --git a/src/tint/lang/wgsl/ast/traverse_expressions.h b/src/tint/lang/wgsl/ast/traverse_expressions.h
index 35e0aac..d16fcd2 100644
--- a/src/tint/lang/wgsl/ast/traverse_expressions.h
+++ b/src/tint/lang/wgsl/ast/traverse_expressions.h
@@ -167,14 +167,9 @@
push_single(unary->expr, p.depth + 1);
return true;
},
- [&](Default) {
- if (TINT_LIKELY((expr->IsAnyOf<LiteralExpression, PhonyExpression>()))) {
- return true; // Leaf expression
- }
- TINT_ICE() << "unhandled expression type: "
- << (expr ? expr->TypeInfo().name : "<null>");
- return false;
- });
+ [&](const LiteralExpression*) { return true; },
+ [&](const PhonyExpression*) { return true; }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
}
diff --git a/src/tint/lang/wgsl/helpers/append_vector.cc b/src/tint/lang/wgsl/helpers/append_vector.cc
index 4b8ce32..f0bce9b 100644
--- a/src/tint/lang/wgsl/helpers/append_vector.cc
+++ b/src/tint/lang/wgsl/helpers/append_vector.cc
@@ -104,12 +104,8 @@
[&](const core::type::I32*) { return b->ty.i32(); },
[&](const core::type::U32*) { return b->ty.u32(); },
[&](const core::type::F32*) { return b->ty.f32(); },
- [&](const core::type::Bool*) { return b->ty.bool_(); },
- [&](Default) {
- TINT_UNREACHABLE() << "unsupported vector element type: "
- << packed_el_sem_ty->TypeInfo().name;
- return ast::Type{};
- });
+ [&](const core::type::Bool*) { return b->ty.bool_(); }, //
+ TINT_ICE_ON_NO_MATCH);
auto* statement = vector_sem->Stmt();
diff --git a/src/tint/lang/wgsl/inspector/inspector.cc b/src/tint/lang/wgsl/inspector/inspector.cc
index e07b996..aa9bcfa 100644
--- a/src/tint/lang/wgsl/inspector/inspector.cc
+++ b/src/tint/lang/wgsl/inspector/inspector.cc
@@ -99,11 +99,8 @@
[&](const core::type::F32*) { return ComponentType::kF32; },
[&](const core::type::F16*) { return ComponentType::kF16; },
[&](const core::type::I32*) { return ComponentType::kI32; },
- [&](const core::type::U32*) { return ComponentType::kU32; },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled component type";
- return ComponentType::kUnknown;
- });
+ [&](const core::type::U32*) { return ComponentType::kU32; }, //
+ TINT_ICE_ON_NO_MATCH);
CompositionType compositionType;
if (auto* vec = type->As<core::type::Vector>()) {
@@ -934,11 +931,8 @@
member->Type(), //
[&](const core::type::F32*) { return PixelLocalMemberType::kF32; },
[&](const core::type::I32*) { return PixelLocalMemberType::kI32; },
- [&](const core::type::U32*) { return PixelLocalMemberType::kU32; },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled component type";
- return PixelLocalMemberType::kUnknown;
- });
+ [&](const core::type::U32*) { return PixelLocalMemberType::kU32; }, //
+ TINT_ICE_ON_NO_MATCH);
types.push_back(type);
}
diff --git a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
index ca4d82b..cf38225 100644
--- a/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
+++ b/src/tint/lang/wgsl/reader/program_to_ir/program_to_ir.cc
@@ -258,10 +258,8 @@
},
[&](const ast::DiagnosticDirective*) {
// Ignored for now.
- },
- [&](Default) {
- add_error(decl->source, "unknown type: " + std::string(decl->TypeInfo().name));
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
if (diagnostics_.contains_errors()) {
@@ -517,11 +515,8 @@
[&](const ast::IncrementDecrementStatement* i) { EmitIncrementDecrement(i); },
[&](const ast::ConstAssert*) {
// Not emitted
- },
- [&](Default) {
- add_error(stmt->source,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void EmitAssignment(const ast::AssignmentStatement* stmt) {
@@ -982,11 +977,8 @@
impl.current_block_->Append(val);
Bind(expr, val->Result());
return nullptr;
- },
- [&](Default) {
- TINT_ICE() << "invalid accessor: " + std::string(sem->TypeInfo().name);
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!index) {
return;
@@ -1287,11 +1279,8 @@
tasks.Push([=] { Process(e->expr); });
},
[&](const ast::LiteralExpression* e) { EmitLiteral(e); },
- [&](const ast::IdentifierExpression* e) { EmitIdentifier(e); },
- [&](Default) {
- impl.add_error(expr->source,
- "Unhandled: " + std::string(expr->TypeInfo().name));
- });
+ [&](const ast::IdentifierExpression* e) { EmitIdentifier(e); }, //
+ TINT_ICE_ON_NO_MATCH);
}
};
@@ -1378,10 +1367,8 @@
// TODO(dsinclair): Probably want to store the const variable somewhere and then
// in identifier expression log an error if we ever see a const identifier. Add
// this when identifiers and variables are supported.
- },
- [&](Default) {
- add_error(var->source, "unknown variable: " + std::string(var->TypeInfo().name));
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
core::ir::Binary* BinaryOp(const core::type::Type* ty,
diff --git a/src/tint/lang/wgsl/resolver/dependency_graph.cc b/src/tint/lang/wgsl/resolver/dependency_graph.cc
index a606a8c..a261629 100644
--- a/src/tint/lang/wgsl/resolver/dependency_graph.cc
+++ b/src/tint/lang/wgsl/resolver/dependency_graph.cc
@@ -136,11 +136,6 @@
/// A map of global name to Global
using GlobalMap = Hashmap<Symbol, Global*, 16>;
-/// Raises an ICE that a global ast::Node type was not handled by this system.
-void UnhandledNode(const ast::Node* node) {
- TINT_ICE() << "unhandled node type: " << node->TypeInfo().name;
-}
-
/// Raises an error diagnostic with the given message and source.
void AddError(diag::List& diagnostics, const std::string& msg, const Source& source) {
diagnostics.add_error(diag::System::Resolver, msg, source);
@@ -206,8 +201,10 @@
[&](const ast::Enable*) {
// Enable directives do not affect the dependency graph.
},
- [&](const ast::ConstAssert* assertion) { TraverseExpression(assertion->condition); },
- [&](Default) { UnhandledNode(global->node); });
+ [&](const ast::ConstAssert* assertion) {
+ TraverseExpression(assertion->condition);
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
private:
@@ -328,12 +325,10 @@
TraverseStatement(w->body);
},
[&](const ast::ConstAssert* assertion) { TraverseExpression(assertion->condition); },
- [&](Default) {
- if (TINT_UNLIKELY((!stmt->IsAnyOf<ast::BreakStatement, ast::ContinueStatement,
- ast::DiscardStatement>()))) {
- UnhandledNode(stmt);
- }
- });
+ [&](const ast::BreakStatement*) {}, //
+ [&](const ast::ContinueStatement*) {}, //
+ [&](const ast::DiscardStatement*) {}, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Adds the symbol definition to the current scope, raising an error if two
@@ -384,69 +379,38 @@
/// Traverses the attribute, performing symbol resolution and determining
/// global dependencies.
void TraverseAttribute(const ast::Attribute* attr) {
- bool handled = Switch(
- attr,
- [&](const ast::BindingAttribute* binding) {
- TraverseExpression(binding->expr);
- return true;
- },
- [&](const ast::BuiltinAttribute* builtin) {
- TraverseExpression(builtin->builtin);
- return true;
- },
- [&](const ast::GroupAttribute* group) {
- TraverseExpression(group->expr);
- return true;
- },
- [&](const ast::IdAttribute* id) {
- TraverseExpression(id->expr);
- return true;
- },
- [&](const ast::IndexAttribute* index) {
- TraverseExpression(index->expr);
- return true;
- },
+ Switch(
+ attr, //
+ [&](const ast::BindingAttribute* binding) { TraverseExpression(binding->expr); },
+ [&](const ast::BuiltinAttribute* builtin) { TraverseExpression(builtin->builtin); },
+ [&](const ast::GroupAttribute* group) { TraverseExpression(group->expr); },
+ [&](const ast::IdAttribute* id) { TraverseExpression(id->expr); },
+ [&](const ast::IndexAttribute* index) { TraverseExpression(index->expr); },
[&](const ast::InterpolateAttribute* interpolate) {
TraverseExpression(interpolate->type);
TraverseExpression(interpolate->sampling);
- return true;
},
- [&](const ast::LocationAttribute* loc) {
- TraverseExpression(loc->expr);
- return true;
- },
- [&](const ast::StructMemberAlignAttribute* align) {
- TraverseExpression(align->expr);
- return true;
- },
- [&](const ast::StructMemberSizeAttribute* size) {
- TraverseExpression(size->expr);
- return true;
- },
+ [&](const ast::LocationAttribute* loc) { TraverseExpression(loc->expr); },
+ [&](const ast::StructMemberAlignAttribute* align) { TraverseExpression(align->expr); },
+ [&](const ast::StructMemberSizeAttribute* size) { TraverseExpression(size->expr); },
[&](const ast::WorkgroupAttribute* wg) {
TraverseExpression(wg->x);
TraverseExpression(wg->y);
TraverseExpression(wg->z);
- return true;
},
[&](const ast::InternalAttribute* i) {
for (auto* dep : i->dependencies) {
TraverseExpression(dep);
}
- return true;
+ },
+ [&](Default) {
+ if (!attr->IsAnyOf<ast::BuiltinAttribute, ast::DiagnosticAttribute,
+ ast::InterpolateAttribute, ast::InvariantAttribute,
+ ast::MustUseAttribute, ast::StageAttribute, ast::StrideAttribute,
+ ast::StructMemberOffsetAttribute>()) {
+ TINT_ICE() << "unhandled attribute type: " << attr->TypeInfo().name;
+ }
});
- if (handled) {
- return;
- }
-
- if (attr->IsAnyOf<ast::BuiltinAttribute, ast::DiagnosticAttribute,
- ast::InterpolateAttribute, ast::InvariantAttribute, ast::MustUseAttribute,
- ast::StageAttribute, ast::StrideAttribute,
- ast::StructMemberOffsetAttribute>()) {
- return;
- }
-
- UnhandledNode(attr);
}
/// The type of builtin that a symbol could represent.
@@ -647,11 +611,8 @@
[&](const ast::Variable* var) { return var->name->symbol; },
[&](const ast::DiagnosticDirective*) { return Symbol(); },
[&](const ast::Enable*) { return Symbol(); },
- [&](const ast::ConstAssert*) { return Symbol(); },
- [&](Default) {
- UnhandledNode(node);
- return Symbol{};
- });
+ [&](const ast::ConstAssert*) { return Symbol(); }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// @param node the ast::Node of the global declaration
@@ -672,10 +633,7 @@
[&](const ast::Function*) { return "function"; }, //
[&](const ast::Variable* v) { return v->Kind(); }, //
[&](const ast::ConstAssert*) { return "const_assert"; }, //
- [&](Default) {
- UnhandledNode(node);
- return "<unknown>";
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// Traverses `module`, collecting all the global declarations and populating
@@ -923,11 +881,8 @@
},
[&](const ast::Parameter* n) { //
return "parameter '" + n->name->symbol.Name() + "'";
- },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled ast::Node: " << node->TypeInfo().name;
- return "<unknown>";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
if (auto builtin_fn = BuiltinFn(); builtin_fn != wgsl::BuiltinFn::kNone) {
return "builtin function '" + tint::ToString(builtin_fn) + "'";
diff --git a/src/tint/lang/wgsl/resolver/resolver.cc b/src/tint/lang/wgsl/resolver/resolver.cc
index b63ddcc..8ea7220 100644
--- a/src/tint/lang/wgsl/resolver/resolver.cc
+++ b/src/tint/lang/wgsl/resolver/resolver.cc
@@ -192,11 +192,8 @@
[&](const ast::TypeDecl* td) { return TypeDecl(td); },
[&](const ast::Function* func) { return Function(func); },
[&](const ast::Variable* var) { return GlobalVariable(var); },
- [&](const ast::ConstAssert* ca) { return ConstAssert(ca); },
- [&](Default) {
- TINT_UNREACHABLE() << "unhandled global declaration: " << decl->TypeInfo().name;
- return false;
- })) {
+ [&](const ast::ConstAssert* ca) { return ConstAssert(ca); }, //
+ TINT_ICE_ON_NO_MATCH)) {
return false;
}
}
@@ -241,14 +238,8 @@
[&](const ast::Var* var) { return Var(var, is_global); },
[&](const ast::Let* let) { return Let(let); },
[&](const ast::Override* override) { return Override(override); },
- [&](const ast::Const* const_) { return Const(const_, is_global); },
- [&](Default) {
- StringStream err;
- err << "Resolver::GlobalVariable() called with a unknown variable type: "
- << v->TypeInfo().name;
- AddICE(err.str(), v->source);
- return nullptr;
- });
+ [&](const ast::Const* const_) { return Const(const_, is_global); }, //
+ TINT_ICE_ON_NO_MATCH);
}
sem::Variable* Resolver::Let(const ast::Let* v) {
@@ -1515,13 +1506,8 @@
current_statement_,
/* constant_value */ nullptr,
/* has_side_effects */ false);
- },
- [&](Default) {
- StringStream err;
- err << "unhandled expression type: " << expr->TypeInfo().name;
- AddICE(err.str(), expr->source);
- return nullptr;
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
if (!sem_expr) {
return nullptr;
}
@@ -3163,11 +3149,8 @@
TINT_UNREACHABLE() << "Unhandled float literal suffix: " << f->suffix;
return nullptr;
},
- [&](const ast::BoolLiteralExpression*) { return b.create<core::type::Bool>(); },
- [&](Default) {
- TINT_UNREACHABLE() << "Unhandled literal type: " << literal->TypeInfo().name;
- return nullptr;
- });
+ [&](const ast::BoolLiteralExpression*) { return b.create<core::type::Bool>(); }, //
+ TINT_ICE_ON_NO_MATCH);
if (ty == nullptr) {
return nullptr;
diff --git a/src/tint/lang/wgsl/resolver/sem_helper.cc b/src/tint/lang/wgsl/resolver/sem_helper.cc
index 19d72b8..adb384e 100644
--- a/src/tint/lang/wgsl/resolver/sem_helper.cc
+++ b/src/tint/lang/wgsl/resolver/sem_helper.cc
@@ -129,12 +129,8 @@
[&](const UnresolvedIdentifier* ui) {
auto name = ui->Identifier()->identifier->symbol.Name();
return "unresolved identifier '" + name + "'";
- },
- [&](Default) -> std::string {
- TINT_ICE() << "unhandled sem::Expression type: "
- << (expr ? expr->TypeInfo().name : "<null>");
- return "<unknown>";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
void SemHelper::ErrorUnexpectedExprKind(
diff --git a/src/tint/lang/wgsl/resolver/uniformity.cc b/src/tint/lang/wgsl/resolver/uniformity.cc
index f419f8e..08259f7 100644
--- a/src/tint/lang/wgsl/resolver/uniformity.cc
+++ b/src/tint/lang/wgsl/resolver/uniformity.cc
@@ -1174,10 +1174,7 @@
return cf; // No impact on uniformity
},
- [&](Default) {
- TINT_ICE() << "unknown statement type: " << std::string(stmt->TypeInfo().name);
- return nullptr;
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// Process an identifier expression.
@@ -1306,11 +1303,7 @@
return std::make_pair(cf, node);
},
- [&](Default) {
- TINT_ICE() << "unknown identifier expression type: "
- << std::string(sem->TypeInfo().name);
- return std::pair<Node*, Node*>(nullptr, nullptr);
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// Process an expression.
@@ -1379,10 +1372,7 @@
return ProcessExpression(cf, u->expr, load_rule);
},
- [&](Default) {
- TINT_ICE() << "unknown expression type: " << std::string(expr->TypeInfo().name);
- return std::pair<Node*, Node*>(nullptr, nullptr);
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// @param u unary expression with op == kIndirection
@@ -1486,11 +1476,7 @@
return ProcessLValueExpression(cf, u->expr, is_partial_reference);
},
- [&](Default) {
- TINT_ICE() << "unknown lvalue expression type: "
- << std::string(expr->TypeInfo().name);
- return LValue{};
- });
+ TINT_ICE_ON_NO_MATCH);
}
/// Process a function call expression.
@@ -1608,8 +1594,8 @@
[&](const sem::ValueConversion*) {
callsite_tag = {CallSiteTag::CallSiteNoRestriction};
function_tag = NoRestriction;
- },
- [&](Default) { TINT_ICE() << "unhandled function call target: " << name; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
cf_after->AddEdge(call_node);
@@ -1899,8 +1885,8 @@
[&](const ast::Expression* e) {
diagnostics_.add_note(diag::System::Resolver,
"result of expression may be non-uniform", e->source);
- },
- [&](Default) { TINT_ICE() << "unhandled source of non-uniformity"; });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// Generate a diagnostic message for a uniformity issue.
diff --git a/src/tint/lang/wgsl/resolver/validation_test.cc b/src/tint/lang/wgsl/resolver/validation_test.cc
index 8468e87..977b79d 100644
--- a/src/tint/lang/wgsl/resolver/validation_test.cc
+++ b/src/tint/lang/wgsl/resolver/validation_test.cc
@@ -141,7 +141,7 @@
b.WrapInFunction(b.create<FakeStmt>());
resolver::Resolve(b);
},
- "internal compiler error: unhandled node type: tint::resolver::FakeStmt");
+ "internal compiler error: Switch() matched no cases. Type: tint::resolver::FakeStmt");
}
TEST_F(ResolverValidationTest, Stmt_If_NonBool) {
@@ -171,7 +171,7 @@
b.WrapInFunction(b.create<FakeExpr>());
Resolver(&b).Resolve();
},
- "internal compiler error: unhandled expression type: tint::resolver::FakeExpr");
+ "internal compiler error: Switch() matched no cases. Type: tint::resolver::FakeExpr");
}
TEST_F(ResolverValidationTest, UsingUndefinedVariable_Fail) {
diff --git a/src/tint/lang/wgsl/resolver/validator.cc b/src/tint/lang/wgsl/resolver/validator.cc
index f2f5d74..d3c0205 100644
--- a/src/tint/lang/wgsl/resolver/validator.cc
+++ b/src/tint/lang/wgsl/resolver/validator.cc
@@ -607,11 +607,7 @@
}, //
[&](const ast::Let*) { return Let(local); }, //
[&](const ast::Const*) { return true; }, //
- [&](Default) {
- TINT_ICE() << "Validator::Variable() called with a unknown variable type: "
- << decl->TypeInfo().name;
- return false;
- });
+ TINT_ICE_ON_NO_MATCH);
}
bool Validator::GlobalVariable(
@@ -645,12 +641,8 @@
return Var(global);
},
[&](const ast::Override*) { return Override(global, override_ids); },
- [&](const ast::Const*) { return Const(global); },
- [&](Default) {
- TINT_ICE() << "Validator::GlobalVariable() called with a unknown variable type: "
- << decl->TypeInfo().name;
- return false;
- });
+ [&](const ast::Const*) { return Const(global); }, //
+ TINT_ICE_ON_NO_MATCH);
if (!ok) {
return false;
diff --git a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
index a2acd0e..7ff0c0d 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
@@ -121,8 +121,8 @@
[&](const ast::TypeDecl* td) { return EmitTypeDecl(td); },
[&](const ast::Function* func) { return EmitFunction(func); },
[&](const ast::Variable* var) { return EmitVariable(Line(), var); },
- [&](const ast::ConstAssert* ca) { return EmitConstAssert(ca); },
- [&](Default) { TINT_UNREACHABLE(); });
+ [&](const ast::ConstAssert* ca) { return EmitConstAssert(ca); }, //
+ TINT_ICE_ON_NO_MATCH);
if (decl != program_.AST().GlobalDeclarations().Back()) {
Line();
}
@@ -157,11 +157,8 @@
EmitExpression(out, alias->type);
out << ";";
},
- [&](const ast::Struct* str) { EmitStructType(str); },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown declared type: " + std::string(ty->TypeInfo().name));
- });
+ [&](const ast::Struct* str) { EmitStructType(str); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitExpression(StringStream& out, const ast::Expression* expr) {
@@ -175,8 +172,8 @@
[&](const ast::LiteralExpression* l) { EmitLiteral(out, l); },
[&](const ast::MemberAccessorExpression* m) { EmitMemberAccessor(out, m); },
[&](const ast::PhonyExpression*) { out << "_"; },
- [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(out, u); },
- [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown expression type"); });
+ [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(out, u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitIndexAccessor(StringStream& out, const ast::IndexAccessorExpression* expr) {
@@ -253,8 +250,8 @@
<< l->suffix;
}
},
- [&](const ast::IntLiteralExpression* l) { out << l->value << l->suffix; },
- [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown literal type"); });
+ [&](const ast::IntLiteralExpression* l) { out << l->value << l->suffix; }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitIdentifier(StringStream& out, const ast::IdentifierExpression* expr) {
@@ -434,8 +431,8 @@
}
},
[&](const ast::Let*) { out << "let"; }, [&](const ast::Override*) { out << "override"; },
- [&](const ast::Const*) { out << "const"; },
- [&](Default) { TINT_ICE() << "unhandled variable type " << v->TypeInfo().name; });
+ [&](const ast::Const*) { out << "const"; }, //
+ TINT_ICE_ON_NO_MATCH);
out << " " << v->name->symbol.Name();
@@ -537,10 +534,8 @@
[&](const ast::StrideAttribute* stride) { out << "stride(" << stride->stride << ")"; },
[&](const ast::InternalAttribute* internal) {
out << "internal(" << internal->InternalName() << ")";
- },
- [&](Default) {
- TINT_ICE() << "Unsupported attribute '" << attr->TypeInfo().name << "'";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
}
@@ -679,11 +674,8 @@
[&](const ast::ReturnStatement* r) { EmitReturn(r); },
[&](const ast::ConstAssert* c) { EmitConstAssert(c); },
[&](const ast::SwitchStatement* s) { EmitSwitch(s); },
- [&](const ast::VariableDeclStatement* v) { EmitVariable(Line(), v->variable); },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- });
+ [&](const ast::VariableDeclStatement* v) { EmitVariable(Line(), v->variable); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void ASTPrinter::EmitStatements(VectorRef<const ast::Statement*> stmts) {
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
index 5dc9a62..4a87f27 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/ir_to_program.cc
@@ -89,11 +89,6 @@
#include "src/tint/utils/math/math.h"
#include "src/tint/utils/rtti/switch.h"
-// Helper for calling TINT_UNIMPLEMENTED() from a Switch(object_ptr) default case.
-#define UNHANDLED_CASE(object_ptr) \
- TINT_UNIMPLEMENTED() << "unhandled case in Switch(): " \
- << (object_ptr ? object_ptr->TypeInfo().name : "<null>")
-
// Helper for incrementing nesting_depth_ and then decrementing nesting_depth_ at the end
// of the scope that holds the call.
#define SCOPED_NESTING() \
@@ -202,7 +197,7 @@
tint::Switch(
inst, //
[&](core::ir::Var* var) { Var(var); }, //
- [&](Default) { UNHANDLED_CASE(inst); });
+ TINT_ICE_ON_NO_MATCH);
}
}
const ast::Function* Fn(core::ir::Function* fn) {
@@ -341,7 +336,7 @@
[&](core::ir::Unary* i) { Unary(i); }, //
[&](core::ir::Unreachable*) {}, //
[&](core::ir::Var* i) { Var(i); }, //
- [&](Default) { UNHANDLED_CASE(inst); });
+ TINT_ICE_ON_NO_MATCH);
}
void If(core::ir::If* if_) {
@@ -641,7 +636,7 @@
Bind(c->Result(), b.Bitcast(ty, args[0]), PtrKind::kPtr);
},
[&](core::ir::Discard*) { Append(b.Discard()); }, //
- [&](Default) { UNHANDLED_CASE(call); });
+ TINT_ICE_ON_NO_MATCH);
}
void Load(core::ir::Load* l) { Bind(l->Result(), Expr(l->From())); }
@@ -692,8 +687,8 @@
} else {
TINT_ICE() << "invalid index for struct type: " << index->TypeInfo().name;
}
- },
- [&](Default) { UNHANDLED_CASE(obj_ty); });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
Bind(a->Result(), expr);
}
@@ -868,11 +863,8 @@
[&](const core::type::Array*) { return composite(/* can_splat */ false); },
[&](const core::type::Vector*) { return composite(/* can_splat */ true); },
[&](const core::type::Matrix*) { return composite(/* can_splat */ false); },
- [&](const core::type::Struct*) { return composite(/* can_splat */ false); },
- [&](Default) {
- UNHANDLED_CASE(c->Type());
- return b.Expr("<error>");
- });
+ [&](const core::type::Struct*) { return composite(/* can_splat */ false); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void Enable(wgsl::Extension ext) {
@@ -969,11 +961,8 @@
[&](const core::type::Reference*) {
TINT_ICE() << "reference types should never appear in the IR";
return b.ty.i32();
- },
- [&](Default) {
- UNHANDLED_CASE(ty);
- return b.ty.i32();
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
ast::Type Struct(const core::type::Struct* s) {
diff --git a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
index 49d2f00..a7f210f 100644
--- a/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
+++ b/src/tint/lang/wgsl/writer/ir_to_program/rename_conflicts.cc
@@ -270,10 +270,8 @@
Switch(
thing, //
[&](core::ir::Value* value) { ir->SetName(value, new_name); },
- [&](core::type::Struct* str) { str->SetName(new_name); },
- [&](Default) {
- TINT_ICE() << "unhandled type for renaming: " << thing->TypeInfo().name;
- });
+ [&](core::type::Struct* str) { str->SetName(new_name); }, //
+ TINT_ICE_ON_NO_MATCH);
}
/// @return true if @p s is a builtin (non-user declared) structure.
diff --git a/src/tint/lang/wgsl/writer/syntax_tree_printer/syntax_tree_printer.cc b/src/tint/lang/wgsl/writer/syntax_tree_printer/syntax_tree_printer.cc
index 90ca7c4..b157a0c 100644
--- a/src/tint/lang/wgsl/writer/syntax_tree_printer/syntax_tree_printer.cc
+++ b/src/tint/lang/wgsl/writer/syntax_tree_printer/syntax_tree_printer.cc
@@ -103,8 +103,8 @@
[&](const ast::TypeDecl* td) { EmitTypeDecl(td); },
[&](const ast::Function* func) { EmitFunction(func); },
[&](const ast::Variable* var) { EmitVariable(var); },
- [&](const ast::ConstAssert* ca) { EmitConstAssert(ca); },
- [&](Default) { TINT_UNREACHABLE(); });
+ [&](const ast::ConstAssert* ca) { EmitConstAssert(ca); }, //
+ TINT_ICE_ON_NO_MATCH);
if (decl != program_.AST().GlobalDeclarations().Back()) {
Line();
@@ -148,11 +148,8 @@
}
Line() << "]";
},
- [&](const ast::Struct* str) { EmitStructType(str); },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown declared type: " + std::string(ty->TypeInfo().name));
- });
+ [&](const ast::Struct* str) { EmitStructType(str); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void SyntaxTreePrinter::EmitExpression(const ast::Expression* expr) {
@@ -166,8 +163,8 @@
[&](const ast::LiteralExpression* l) { EmitLiteral(l); },
[&](const ast::MemberAccessorExpression* m) { EmitMemberAccessor(m); },
[&](const ast::PhonyExpression*) { Line() << "[PhonyExpression]"; },
- [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(u); },
- [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown expression type"); });
+ [&](const ast::UnaryOpExpression* u) { EmitUnaryOp(u); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void SyntaxTreePrinter::EmitIndexAccessor(const ast::IndexAccessorExpression* expr) {
@@ -272,8 +269,8 @@
<< l->suffix;
}
},
- [&](const ast::IntLiteralExpression* l) { Line() << l->value << l->suffix; },
- [&](Default) { diagnostics_.add_error(diag::System::Writer, "unknown literal type"); });
+ [&](const ast::IntLiteralExpression* l) { Line() << l->value << l->suffix; }, //
+ TINT_ICE_ON_NO_MATCH);
}
Line() << "]";
}
@@ -499,8 +496,8 @@
},
[&](const ast::Let*) { Line() << "Let []"; },
[&](const ast::Override*) { Line() << "Override []"; },
- [&](const ast::Const*) { Line() << "Const []"; },
- [&](Default) { TINT_ICE() << "unhandled variable type " << v->TypeInfo().name; });
+ [&](const ast::Const*) { Line() << "Const []"; }, //
+ TINT_ICE_ON_NO_MATCH);
Line() << "name: " << v->name->symbol.Name();
@@ -648,10 +645,8 @@
},
[&](const ast::InternalAttribute* internal) {
Line() << "InternalAttribute [" << internal->InternalName() << "]";
- },
- [&](Default) {
- TINT_ICE() << "Unsupported attribute '" << attr->TypeInfo().name << "'";
- });
+ }, //
+ TINT_ICE_ON_NO_MATCH);
}
}
@@ -812,11 +807,8 @@
[&](const ast::ReturnStatement* r) { EmitReturn(r); },
[&](const ast::ConstAssert* c) { EmitConstAssert(c); },
[&](const ast::SwitchStatement* s) { EmitSwitch(s); },
- [&](const ast::VariableDeclStatement* v) { EmitVariable(v->variable); },
- [&](Default) {
- diagnostics_.add_error(diag::System::Writer,
- "unknown statement type: " + std::string(stmt->TypeInfo().name));
- });
+ [&](const ast::VariableDeclStatement* v) { EmitVariable(v->variable); }, //
+ TINT_ICE_ON_NO_MATCH);
}
void SyntaxTreePrinter::EmitStatements(VectorRef<const ast::Statement*> stmts) {