Based on a suggestion from Richard Smith, this switches TypeSystemClang over to Decl*::CreateDeserialized() which is the more appropriate API for its use-case.
The changes that remove the non-existent module parameter slipped in by mistake I think and the rest LGTM. I didn't verify if all the setX calls are 100% identical to what the constructor would do but *usually* Decl constructor don't any fancy logic so the new code should be equivalent. Maybe dump some module AST before and after this patch and just diff it to see if anything changed.
A bunch of small comments but a few more serious ones as well.
It does not look like func_decl->getLocation() get used at all.
I guess clang::SC_None is the default?
Where does 1 << 1 come from? What does it mean?
Everywhere else we do:
if (name && name)
Why not for this case?