Of course it leaks. Or at least it stores strings in the RAM and never flushes them. That can be called "leak" in many situations.
Unfortunatly, StringHash cannot be a good test for that (it doesn't return the string's id but really uses an hash algorithm, it seems...).
I'd say like WaterKnight, it leaks 3 times. I don't think it is the 2 times leak and if it only leaks once ("AB"), it may only be working for concatenation of static strings, which is lame.