So, pair vs make_pair
std::make_pair deduces its argument types, and from its function arguments, creates a std::pair
https://www.cplusplus.com/reference/utility/make_pair/std::pair (src at
https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a02030.html) takes its constructor arguments by reference. Thus, it is needed to take the address of the thing passed in (e.g. MapData::O_WESTWALL). This has no address - the variable is declared and initialised, inside the class, but not defined outside the class. Therefore, no storage was allocated, and it has no address.
For std::make_pair, the arguments to the internal call to std::pair(a,b) use the address of the arguments in the call to std::make_pair, and so that works. The compiler can see
declaration of MapData::O_WESTWALL specified a constant int value, so that can be used in the call to std::make_pair
Why did it only break on clang? No idea. The problem is that the static consts in the class are not addressable, so the problem may recur if any other code attempts to take their address (e.g. ever using those values to a function taking an int& operand). The real solution imo is to add the out of class definitions.
The code as is with the make_pair change is back up and building in the OSX buildbot as before ;-)