Skip to content

Commit 49c89a4

Browse files
committed
Handle unused params and bindings in matches
1 parent 1b54544 commit 49c89a4

File tree

4 files changed

+210
-14
lines changed

4 files changed

+210
-14
lines changed

src/main/scala/fred/Translator.scala

+19-13
Original file line numberDiff line numberDiff line change
@@ -570,19 +570,21 @@ object Translator {
570570
val remVars =
571571
findLastUsages(body, vars | newVars)(using newBindings)
572572

573-
unusedVars ++= newVars -- remVars
573+
unusedVars ++= newVars & remVars
574574

575-
arm -> remVars
575+
arm -> (remVars -- newVars)
576576
}.toMap
577577

578-
for (arm <- arms) {
579-
val remVars = armVars(arm)
580-
val otherArms = arms.filter(_ != arm)
581-
val otherVars = otherArms.map(armVars).reduce(_ | _)
582-
lastUsagesPre(arm.body) = remVars -- otherVars
578+
if (arms.size > 1) {
579+
for (arm <- arms) {
580+
val remVars = armVars(arm)
581+
val otherArms = arms.filter(_ != arm)
582+
val otherVars = otherArms.map(armVars).fold(Set.empty)(_ | _)
583+
lastUsagesPre(arm.body) = remVars -- otherVars
584+
}
583585
}
584586

585-
val commonUnused = armVars.values.reduce(_ | _)
587+
val commonUnused = armVars.values.reduce(_ & _)
586588
findLastUsages(obj, commonUnused)
587589
}
588590
}
@@ -742,14 +744,18 @@ object Translator {
742744
mangledVars
743745
.put(newBindings.vars(varName.value), mangledVarName)
744746
}
745-
addBinding(
747+
val fieldType = newBindings.types(
748+
variant.fields.find(_.name.value == fieldName.value).get.typ
749+
.name
750+
)
751+
val (setup, teardown) = addBinding(
746752
mangledVarName,
747753
s"$objVar->$fieldNameMangled",
748-
newBindings.types(
749-
variant.fields.find(_.name.value == fieldName.value).get
750-
.typ.name
751-
)
754+
fieldType
752755
)
756+
if (unusedVars.contains(newBindings.vars(varName.value))) {
757+
(s"$setup\n${decrRc(mangledVarName, fieldType)}", teardown)
758+
} else { (setup, teardown) }
753759
}.unzip
754760
val (bodySetup, bodyToC, bodyTeardown) =
755761
exprToC(body)(using newBindings)

src/test/resources/snapshot/exec/unused-3jpowi.c

+171
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/test/resources/snapshot/gen/complex-liudr567.c

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/test/scala/fred/ExecTests.scala

+19
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,25 @@ class ExecTests extends AnyFunSuite, SnapshotAssertions {
3636
valgrindCheck(code, "immediate-drop.c")("")
3737
}
3838

39+
test("Unused variables") {
40+
val code = """
41+
data List = Cons { next: List } | Nil {}
42+
43+
fn f(list: List): int =
44+
list match {
45+
Cons { next: list } =>
46+
let list = Nil {} in
47+
0,
48+
Nil {} => 2
49+
}
50+
51+
fn main(): int =
52+
f(Cons { next: Nil {} });
53+
0
54+
"""
55+
valgrindCheck(code, "unused-3jpowi.c")("")
56+
}
57+
3958
test("Basic main function") {
4059
val code = """
4160
data List

0 commit comments

Comments
 (0)