Most compilers have an flag to enable all errors (-Wall on gcc if I remember rightly). It is worth running this flag.
I tend to do this out of habit: though it's sometimes annoyingly pedantic, it's a great way of finding potential logic errors of the type that can sometimes take days to track down otherwise...
As for declaring main() as void, that's something that I seem to have dredged from my memory that could've happened at any time in the last 25 years! I think I had a moment's uncertainty as I tend to mainly use BSD Unix for compilations these days and I'm not sure if that tends to rigidly follow the standards elsewhere or not (or vice-versa, depending).
And as regards implicit returns, at least you don't see something I discovered with a compiler (whose creator shall remain nameless) quite a few years ago that would fall through the bottom of a procedure and start executing the next one unless an explicit return statement was present. That was... disconcerting. And very broken.
