From d0cc448db9ac553b2b28b7a22e1e4248519eb780 Mon Sep 17 00:00:00 2001 From: Evan Mark Hopkins Date: Fri, 10 Mar 2023 15:56:08 -0500 Subject: [PATCH] [glsl-in] Switch implicit type conversion --- src/front/glsl/parser/functions.rs | 14 ++++++++++---- tests/in/glsl/statements.frag | 9 +++++++++ tests/out/wgsl/statements-frag.wgsl | 22 ++++++++++++++++++---- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/front/glsl/parser/functions.rs b/src/front/glsl/parser/functions.rs index 8bfb9040b8..781f4cffed 100644 --- a/src/front/glsl/parser/functions.rs +++ b/src/front/glsl/parser/functions.rs @@ -166,11 +166,14 @@ impl<'source> ParsingContext<'source> { self.expect(frontend, TokenValue::LeftParen)?; - let selector = { + let (selector, uint) = { let mut stmt = ctx.stmt_ctx(); let expr = self.parse_expression(frontend, ctx, &mut stmt, body)?; - ctx.lower_expect(stmt, frontend, expr, ExprPos::Rhs, body)? - .0 + let (root, meta) = + ctx.lower_expect(stmt, frontend, expr, ExprPos::Rhs, body)?; + let uint = frontend.resolve_type(ctx, root, meta)?.scalar_kind() + == Some(crate::ScalarKind::Uint); + (root, uint) }; self.expect(frontend, TokenValue::RightParen)?; @@ -197,7 +200,10 @@ impl<'source> ParsingContext<'source> { ConstantInner::Scalar { value: ScalarValue::Sint(int), .. - } => crate::SwitchValue::I32(int as i32), + } => match uint { + true => crate::SwitchValue::U32(int as u32), + false => crate::SwitchValue::I32(int as i32), + }, ConstantInner::Scalar { value: ScalarValue::Uint(int), .. diff --git a/tests/in/glsl/statements.frag b/tests/in/glsl/statements.frag index c9e276c87b..3423e73b80 100644 --- a/tests/in/glsl/statements.frag +++ b/tests/in/glsl/statements.frag @@ -15,6 +15,15 @@ void switchNoDefault(int a) { return; } +void switchCaseImplConv(uint a) { + switch (a) { + case 0: + break; + } + + return; +} + void switchNoLastBreak(int a) { switch (a) { default: diff --git a/tests/out/wgsl/statements-frag.wgsl b/tests/out/wgsl/statements-frag.wgsl index b799959320..bc36eb2075 100644 --- a/tests/out/wgsl/statements-frag.wgsl +++ b/tests/out/wgsl/statements-frag.wgsl @@ -24,15 +24,29 @@ fn switchNoDefault(a_2: i32) { return; } -fn switchNoLastBreak(a_4: i32) { - var a_5: i32; - var b: i32; +fn switchCaseImplConv(a_4: u32) { + var a_5: u32; a_5 = a_4; let _e2 = a_5; + switch _e2 { + case 0u: { + } + default: { + } + } + return; +} + +fn switchNoLastBreak(a_6: i32) { + var a_7: i32; + var b: i32; + + a_7 = a_6; + let _e2 = a_7; switch _e2 { default: { - let _e3 = a_5; + let _e3 = a_7; b = _e3; } }