IO.warn doesn't stop compiler with --warning-as-errors

In my project, I have a compile-time code that can generate some warning depending on some circumstances.

To show the warning I do IO.warn(“…”).

The problem is that, with this, the compiler will happily continue even if I add –warning-as-errors option.

Shouldn’t that option make the compiler fail in this case or am I missing something here?

The docs kinda imply that only warn/2 emits the diagnostic and not warn/1, which seems like an unfortunate overloading of the function name to me.

FWIW, IO.warn/1 directly calls IO.warn/2:

@sezaru - long shot, but is it possible you’re running into something weird from the tail-call optimization mentioned in the docs for IO.warn/1?

1 Like

Actually, the code that generates the warning is from AshGraphql, I just didn’t add that before because I thought it was unnecessary. But either way that code is run at compile time for the resource I’m creating, so I think it should count as “my code” and not as “dependency code”.

I also tried adding some other warnings to see if it would stop the compiler but they didn’t, basically I tried this:

defmodule Bla do
  IO.warn("HUEHUE")
  a = 5
end  

which generated the following warnings:

core [fly_fixes]× » mix compile --warning-as-errors                                                               ~/p/r/p/core
Compiling 1 file (.ex)
    warning: variable "a" is unused (if the variable is not meant to be used, prefix it with an underscore)
    │
  3 │   a = 5
    │   ~
    │
    └─ lib/core/application.ex:3:3: Bla (module)

warning: HUEHUE
  lib/core/application.ex:2: (module)
  (elixir 1.19.1) elixir_compiler.erl:81: :elixir_compiler.dispatch/4
  (elixir 1.19.1) elixir_compiler.erl:56: :elixir_compiler.compile/4
  (elixir 1.19.1) elixir_module.erl:477: :elixir_module.eval_form/7
  (elixir 1.19.1) elixir_module.erl:163: :elixir_module.compile/7
  (stdlib 7.1) lists.erl:2466: :lists.foldl/3

Generated core app

core [fly_fixes]× » echo $status                                                                                  ~/p/r/p/core
0

As you can see, the warnings show up during compilation, but the compilation itself finished without any errors.

Btw, I’m using Elixir 1.19.1

Oh so it does, never mind then! Usually when functions of different arity share behavior it’s mentioned in the docs (e.g. this one in the same module) so that threw me off.

Yeah.. I don’t get this, I tried a lot of different warnings and projects, I also tried with Elixir 1.18 and I still can’t make --warnings-as-errors work at all.

I’m just not sure if this is actually a bug or just something else that I’m missing because I’m confident that if it was really not working for everyone, then this would be already reported tbh.

Does this option works for you guys? If so, do you mind giving me a code snippet that generates a warning that should be triggered as an error when using this option for me to try it?

In this example, you have used --warning-as-errors and not --warnings-as-errors

5 Likes

Dear god, I can’t believe that was it…:sweat_smile: :joy:

1 Like