[ir] Skip builtin structures when creating AST
The result types of frexp and modf are unnameable, and should not be
emitted as declarations or named as explicit types for let and var
declarations.
Bug: 350518995
Change-Id: Ic19153efe03ed0c270f9bcb426dc76c4f96ba079
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/196595
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/ir_roundtrip_test.cc b/src/tint/lang/wgsl/ir_roundtrip_test.cc
index 7687fa4..7afcb96 100644
--- a/src/tint/lang/wgsl/ir_roundtrip_test.cc
+++ b/src/tint/lang/wgsl/ir_roundtrip_test.cc
@@ -3363,5 +3363,19 @@
)");
}
+// Test that we do not try to declare or name the unnameable builtin structure types.
+// See crbug.com/350518995.
+TEST_F(IRToProgramRoundtripTest, BuiltinStructInLetAndVar) {
+ RUN_TEST(R"(
+fn a(x : f32) {
+ let b = frexp(x);
+}
+
+fn c(y : f32) {
+ var d = frexp(y);
+}
+)");
+}
+
} // namespace
} // namespace tint::wgsl
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 37fe9ef..dd7878f 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
@@ -1007,6 +1007,12 @@
}
ast::Type Struct(const core::type::Struct* s) {
+ // Skip builtin structures.
+ // TODO(350778507): Consider using a struct flag for builtin structures instead.
+ if (tint::HasPrefix(s->Name().NameView(), "__")) {
+ return ast::Type{};
+ }
+
auto n = structs_.GetOrAdd(s, [&] {
auto members = tint::Transform<8>(s->Members(), [&](const core::type::StructMember* m) {
auto ty = Type(m->Type());