
`ASTReader::FinishedDeserializing()` calls `adjustDeductedFunctionResultType(...)` [0], which in turn calls `FunctionDecl::getMostRecentDecl()`[1]. In modules builds, `getMostRecentDecl()` may reach out to the `ASTReader` and start deserializing again. Starting deserialization starts `ReadTimer`; however, `FinishedDeserializing()` doesn't call `stopTimer()` until after it's call to `adjustDeductedFunctionResultType(...)` [2]. As a result, we hit an assert checking that we don't start an already started timer [3]. To fix this, we simply don't start the timer if it's already running. Unfortunately I don't have a test case for this yet as modules builds are notoriously difficult to reduce. [0]:4d2288d318/clang/lib/Serialization/ASTReader.cpp (L11053)
[1]:4d2288d318/clang/lib/AST/ASTContext.cpp (L3804)
[2]:4d2288d318/clang/lib/Serialization/ASTReader.cpp (L11065-L11066)
[3]:4d2288d318/llvm/lib/Support/Timer.cpp (L150)