Skip to content

Commit d6a6fd5

Browse files
committed
feat(compiler): Introduce warning if non-void expression value not used or ignored
1 parent c8624c3 commit d6a6fd5

33 files changed

+295
-225
lines changed

compiler/src/typed/typecore.re

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,11 +2231,10 @@ and type_statement_expr = (~explanation=?, ~in_function=?, env, sexp) => {
22312231
/*| Tarrow _ -> [not really applicable with our syntax]
22322232
Location.prerr_warning loc Warnings.Partial_application*/
22332233
| TTyConstr(p, _, _) when Path.same(p, Builtin_types.path_void) => ()
2234+
| TTyVar(None) => ()
22342235
/*| Tvar _ ->
22352236
add_delayed_check (fun () -> check_application_result env true exp)*/
2236-
| _ => ()
2237-
/* This isn't quite relevant to Grain mechanics
2238-
Location.prerr_warning loc Grain_utils.Warnings.StatementType */
2237+
| _ => Location.prerr_warning(loc, Grain_utils.Warnings.StatementType)
22392238
};
22402239
unify_var(env, tv, ty);
22412240
exp;

compiler/src/utils/warnings.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ let message =
101101
"these field labels belong to several types: "
102102
++ String.concat(" ", tl)
103103
++ "\nThe first one was selected. Please disambiguate if this is wrong."
104-
| StatementType => "this expression should have type void."
104+
| StatementType => "this expression should have type void. Use `ignore` to ignore the result of the expression"
105105
| NonreturningStatement => "this statement never returns (or has an unsound type)."
106106
| AllClausesGuarded => "this pattern-matching is not exhaustive.\nAll clauses in this pattern-matching are guarded."
107107
| PartialMatch("") => "this pattern-matching is not exhaustive."

compiler/test/input/wasiPolyfill.gr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ provide let fd_write: (WasmI32, WasmI32, WasmI32, WasmI32) => WasmI32 =
1414
iovs_len,
1515
nwritten,
1616
) => {
17-
fd_write(fd, iovs, iovs_len, nwritten)
18-
fd_write(fd, iovs, iovs_len, nwritten)
17+
let _ = fd_write(fd, iovs, iovs_len, nwritten)
18+
let _ = fd_write(fd, iovs, iovs_len, nwritten)
1919
fd_write(fd, iovs, iovs_len, nwritten)
2020
}
2121

compiler/test/runner.re

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ let makeSnapshotRunner =
206206
(~config_fn=?, test, ~module_header=module_header, name, prog) => {
207207
test(name, ({expect}) => {
208208
Config.preserve_all_configs(() => {
209+
Config.print_warnings := false;
209210
ignore @@
210211
compile(
211212
~hook=stop_after_object_file_emitted,
@@ -234,6 +235,7 @@ let makeFilesizeRunner =
234235
let makeSnapshotFileRunner = (test, ~config_fn=?, name, filename) => {
235236
test(name, ({expect}) => {
236237
Config.preserve_all_configs(() => {
238+
Config.print_warnings := false;
237239
let infile = grainfile(filename);
238240
let outfile = wasmfile(name);
239241
ignore @@

compiler/test/stdlib/array.test.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ module Immutable {
835835

836836
// Array.rotate
837837
let arr1 = fromList([1, 2, 3, 4, 5])
838-
Array.rotate(0, arr1)
838+
ignore(Array.rotate(0, arr1))
839839
assert arr1 == fromList([1, 2, 3, 4, 5])
840840

841841
let arr2 = fromList([1, 2, 3, 4, 5])

compiler/test/stdlib/char.test.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ while (!done) {
5151
break
5252
}
5353

54-
Char.code(chars[charPosition])
54+
ignore(Char.code(chars[charPosition]))
5555
charPosition += 1
5656
}
5757

compiler/test/stdlib/path.test.gr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,8 @@ List.forEach(({ base, toAppend, final }) => {
216216
assert append == Ok(expPath)
217217
}, appendTests)
218218

219-
Path.append(fs("file"), fs("f")) == Err(Path.AppendToFile)
220-
Path.append(fs("/d/"), fs("/f")) == Err(Path.AppendAbsolute)
219+
assert Path.append(fs("file"), fs("f")) == Err(Path.AppendToFile)
220+
assert Path.append(fs("/d/"), fs("/f")) == Err(Path.AppendAbsolute)
221221

222222
record RelativeToDirTestData {
223223
source: String,

compiler/test/stdlib/queue.test.gr

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Queue.push(4, queue)
2929
assert Queue.size(queue) == 3
3030
assert Queue.peek(queue) == Some(2)
3131
let copy = Queue.copy(queue)
32-
Queue.pop(copy)
32+
ignore(Queue.pop(copy))
3333
assert Queue.size(copy) == 2
3434
assert Queue.size(queue) == 3
3535
Queue.clear(queue)
@@ -61,11 +61,11 @@ Queue.push(1, queue)
6161
Queue.push(2, queue)
6262
Queue.push(3, queue)
6363
assert Queue.toList(queue) == [0, 1, 2, 3]
64-
Queue.pop(queue)
64+
ignore(Queue.pop(queue))
6565
assert Queue.toList(queue) == [1, 2, 3]
6666
Queue.push(3, queue)
6767
assert Queue.toList(queue) == [1, 2, 3, 3]
68-
Queue.pop(queue)
68+
ignore(Queue.pop(queue))
6969
Queue.push(4, queue)
7070
Queue.push(5, queue)
7171
assert Queue.toList(queue) == [2, 3, 3, 4, 5]
@@ -121,12 +121,12 @@ Queue.push(1, queue2)
121121
Queue.push(2, queue2)
122122
Queue.push(3, queue2)
123123
Queue.push(4, queue2)
124-
Queue.pop(queue2)
125-
Queue.pop(queue2)
124+
ignore(Queue.pop(queue2))
125+
ignore(Queue.pop(queue2))
126126
Queue.push(5, queue2)
127-
Queue.pop(queue2)
128-
Queue.pop(queue2)
129-
Queue.pop(queue2)
127+
ignore(Queue.pop(queue2))
128+
ignore(Queue.pop(queue2))
129+
ignore(Queue.pop(queue2))
130130
Queue.push(6, queue2)
131131
Queue.push(7, queue2)
132132
Queue.push(8, queue2)
@@ -149,7 +149,7 @@ Queue.push(2, queue3)
149149
Queue.push(3, queue3)
150150
assert Queue.toArray(queue3) == [> 1, 2, 3]
151151
let queue4 = Queue.copy(queue3)
152-
Queue.pop(queue4)
152+
ignore(Queue.pop(queue4))
153153
assert Queue.toArray(queue4) == [> 2, 3]
154154

155155
// Queue.fromArray
@@ -169,12 +169,12 @@ Queue.push(1, queue2)
169169
Queue.push(2, queue2)
170170
Queue.push(3, queue2)
171171
Queue.push(4, queue2)
172-
Queue.pop(queue2)
173-
Queue.pop(queue2)
172+
ignore(Queue.pop(queue2))
173+
ignore(Queue.pop(queue2))
174174
Queue.push(5, queue2)
175-
Queue.pop(queue2)
176-
Queue.pop(queue2)
177-
Queue.pop(queue2)
175+
ignore(Queue.pop(queue2))
176+
ignore(Queue.pop(queue2))
177+
ignore(Queue.pop(queue2))
178178
Queue.push(6, queue2)
179179
Queue.push(7, queue2)
180180
Queue.push(8, queue2)
@@ -194,7 +194,7 @@ Queue.push(1, queue3)
194194
Queue.push(2, queue3)
195195
Queue.push(3, queue3)
196196
let queue4 = Queue.copy(queue3)
197-
Queue.pop(queue4)
197+
ignore(Queue.pop(queue4))
198198
let queue5 = Queue.make()
199199
Queue.push(6, queue5)
200200
Queue.push(7, queue5)
@@ -222,7 +222,7 @@ Queue.push(3, queue7)
222222
assert queue4 == queue7
223223
let queue8 = Queue.make()
224224
Queue.push(1, queue8)
225-
Queue.pop(queue8)
225+
ignore(Queue.pop(queue8))
226226
assert queue8 == queue1
227227

228228
assert !(queue2 == queue3)

compiler/test/stdlib/set.test.gr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ module Immutable {
327327

328328
let mut filterTestSet = makeTestSet()
329329

330-
Set.filter(key => fail "Shouldn't be called", Set.empty)
330+
ignore(Set.filter(key => fail "Shouldn't be called", Set.empty))
331331
filterTestSet = Set.filter(key => key == Sheep, filterTestSet)
332332

333333
assert !Set.contains(Grain, filterTestSet)
@@ -338,7 +338,7 @@ module Immutable {
338338

339339
let mut rejectTestSet = makeTestSet()
340340

341-
Set.reject(key => fail "Shouldn't be called", Set.empty)
341+
ignore(Set.reject(key => fail "Shouldn't be called", Set.empty))
342342
rejectTestSet = Set.reject(key => key == Sheep, rejectTestSet)
343343

344344
assert Set.contains(Grain, rejectTestSet)

compiler/test/stdlib/stack.test.gr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Stack.push(4, stack)
2828
assert Stack.size(stack) == 3
2929
assert Stack.peek(stack) == Some(4)
3030
let copy = Stack.copy(stack)
31-
Stack.pop(copy)
31+
ignore(Stack.pop(copy))
3232
assert Stack.size(copy) == 2
3333
assert Stack.size(stack) == 3
3434
Stack.clear(stack)

0 commit comments

Comments
 (0)