[glsl-out] introduce a new block for switch cases

This commit is contained in:
teoxoy
2022-11-17 18:10:19 +01:00
committed by Jim Blandy
parent eccdc0aeb1
commit f36adeefaa
2 changed files with 50 additions and 28 deletions

View File

@@ -1807,23 +1807,29 @@ impl<'a, W: Write> Writer<'a, W> {
for case in cases {
match case.value {
crate::SwitchValue::Integer(value) => {
writeln!(self.out, "{}case {}{}:", l2, value, type_postfix)?
write!(self.out, "{}case {}{}:", l2, value, type_postfix)?
}
crate::SwitchValue::Default => writeln!(self.out, "{}default:", l2)?,
crate::SwitchValue::Default => write!(self.out, "{}default:", l2)?,
}
let write_block_braces = !(case.fall_through && case.body.is_empty());
if write_block_braces {
writeln!(self.out, " {{")?;
} else {
writeln!(self.out)?;
}
for sta in case.body.iter() {
self.write_stmt(sta, ctx, l2.next())?;
}
// Write fallthrough comment if the case is fallthrough,
// otherwise write a break, if the case is not already
// broken out of at the end of its body.
if case.fall_through {
writeln!(self.out, "{}/* fallthrough */", l2.next())?;
} else if case.body.last().map_or(true, |s| !s.is_terminator()) {
if !case.fall_through && case.body.last().map_or(true, |s| !s.is_terminator()) {
writeln!(self.out, "{}break;", l2.next())?;
}
if write_block_braces {
writeln!(self.out, "{}}}", l2)?;
}
}
writeln!(self.out, "{}}}", level)?

View File

@@ -8,17 +8,20 @@ layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void switch_default_break(int i) {
switch(i) {
default:
default: {
break;
}
}
}
void switch_case_break() {
switch(0) {
case 0:
case 0: {
break;
default:
}
default: {
break;
}
}
return;
}
@@ -26,10 +29,12 @@ void switch_case_break() {
void loop_switch_continue(int x) {
while(true) {
switch(x) {
case 1:
case 1: {
continue;
default:
}
default: {
break;
}
}
}
return;
@@ -43,54 +48,65 @@ void main() {
memoryBarrierShared();
barrier();
switch(1) {
default:
default: {
pos = 1;
break;
}
}
int _e4 = pos;
switch(_e4) {
case 1:
case 1: {
pos = 0;
break;
case 2:
}
case 2: {
pos = 1;
break;
}
case 3:
/* fallthrough */
case 4:
case 4: {
pos = 2;
break;
case 5:
}
case 5: {
pos = 3;
break;
}
default:
/* fallthrough */
case 6:
case 6: {
pos = 4;
break;
}
}
switch(0u) {
case 0u:
case 0u: {
break;
default:
}
default: {
break;
}
}
int _e11 = pos;
switch(_e11) {
case 1:
case 1: {
pos = 0;
break;
case 2:
}
case 2: {
pos = 1;
return;
case 3:
}
case 3: {
pos = 2;
return;
case 4:
}
case 4: {
return;
default:
}
default: {
pos = 3;
return;
}
}
}