Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Fixing "used but never defined" warnings

1,471 views
Skip to first unread message

Nicholas Nethercote

unread,
Jun 5, 2013, 9:05:17 PM6/5/13
to JS Internals list, Daniel Holbert
Hi,

Have you ever struggled with one of GCC's "used but never defined"
warnings? I certainly have, and I've just now worked out a good way
to work out what the problem is. Take this example:

../../gc/Barrier.h:489:17: warning: inline function ‘void
js::HeapSlot::init(JSRuntime*, JSObject*, js::HeapSlot::Kind,
uint32_t, const JS::Value&)’ used but never defined [enabled by
default]

What I do is rename that function to something that will cause a
compile error at its use sites, e.g. init2(). I then recompile. The
first compile error is very likely to be the problem. In this case I
got the following:

../vm/ObjectImpl-inl.h: In member function ‘void
js::ObjectImpl::initializeSlotRange(uint32_t, uint32_t)’:
../vm/ObjectImpl-inl.h:226:85: error: no matching function for call to
‘js::HeapSlot::init(JSRuntime*&, JSObject*, js::HeapSlot::Kind,
uint32_t, JS::Value)’

And sure enough, vm/ObjectImpl-inl.h is using HeapSlot::init() but it
doesn't #include gc/Barrier-inl.h, which defines HeapSlot::init().

It might not be the first compile error (though in my experience it
usually is), but it will be an error in a .h file.

Now this doesn't tell you how to fix it, but at least it tells you
where the problem is, which is often the hard part (in my experience).

Nick

ps: jorendorff and I are working on detangling SpiderMonkey's horrific
#include hairball. See
https://bugzilla.mozilla.org/show_bug.cgi?id=880088 and the dependent
bugs if you want to follow along. This should simplify things, and
hopefully also reduce build times.
0 new messages