"Expected to drop a reference" assertion thrown


A few days ago I upgraded to the LLVM/clang ToT (on Jan 19th or so) and I just encountered this assertion.

“Expected to drop a reference” which is defined in llvm/lib/IR/Metadata.cpp line 136.

I create DebugLoc objects using DebugLog:get(unsigned line, unsigned Col, MDNode *Scope, MDNode *InlinedAt=nullptr)

The DebugLoc objects are wrapped in one of my classes and when instances get destructed the assertion is thrown.

Would anyone have an idea what I’m doing wrong that causes this?


Christian Schafmeister
Chemistry Department
Temple University

The first thing I'd try is recompiling with ASan support. All the cases
I've seen of this assertion firing are use-after-frees.

Likely your `LLVMContext` has been destroyed already by the time this
`DebugLoc` is deleted. Since `LLVMContext` teardown assumes that there
aren't any live tracking references to metadata, you need to `reset()` or
destroy the `DebugLoc`s before destroying the context.

Thank you - I’ll give ASan a try - it may alert/protect me from other problems that come up down the road.
This is almost certainly a memory management problem on my end. I was managing the DebugLoc’s lifetime using my copying garbage collector.
I implemented a work around where I don’t expose the DebugLoc to my garbage collector and the problem went away.