Also from the Jenkins log, I also see redefinitions of smartlist_t that occur in relay_config.h, transport_config.h, but not dirauth_config.h.
For or_options_t, I see several possible options:
Leave the or_options_t typedef in or.h, but require that inclusion of or.h precede any other headers that require that typedef. That's not great from a standpoint of modularizing our headers.
Remove the or_options_t typedef from or.h, and define it in a shared header file.
Leave the or_options_t typedef in or.h, but remove all references to the typedef in header files (using the struct tag instead).
Other possibilities might exist. What do you think?
For the smartlist_t redefinitions, maybe we can explicitly include smartlist.h in those headers? Is there a reason not to?
Also, it's probably worth noting that when I tried write minimal test cases to produce this warning, I was only able to do so on clang, and even then only if using options such as -std=c99. So maybe FreeBSD adjusts some of the warning behaviors. Note this means that Travis CI probably won't detect future instances of this problem.