[Niall Douglas]
I have confirmed this ICE in MSVC (15.5.4). It also occurs in Microsoft's C2 clang edition.
Clang/C2 3.8 is no longer supported for C++ and will be removed. Our STL is now tested with Clang/LLVM 5.0.1. In VS 2017 15.6, the STL will emit an error if it detects an unexpectedly old compiler being used; that release will accept Clang 5 and newer, and reject Clang 4 and older.
Shame on Microsoft, an empty source file instantiating nothing should never, *ever* ICE the compiler, no matter the headers included. CC Stephan and Andrew, because this is *bad*.
What you call "an empty source file" is actually a translation unit presumably dragging in a megabyte or more of (template and non-template) class definitions, and (template and non-template) function implementations. This asks the compiler to do a lot of work, even before considering what two-phase name lookup demands. This is also why PCHes help, by saving the result of that work to be reloaded later. (None of this is an excuse, just an explanation.) That said, ICEs are compiler bugs by definition. Please submit a preprocessed repro for us to investigate. The proper form of a preprocessed repro is: cl OPTIONS meow.cpp (triggers ICE) cl OPTIONS /P meow.cpp (preprocesses) cl OPTIONS /TP meow.i (verifies that compiling the preprocessed file triggers the same ICE) Please submit meow.i and the corresponding command line. (I suspect that this is a backend ICE, if Clang/C2 reproed it too, but a preprocessed file will let us figure out the root cause.) STL