@cduclos: "the copy function will only be called if the Queue is shared" - yes, but here the constructor is refusing to build a Queue without copy, even if the caller knows the resulting Queue would never have been copied; so the caller is obliged to pass a non-NULL copy that'll be used by Add.  Of course <code> void * fatuous_copy(void * p) { return p; } </code> would do in that case, so there is a work-around (that I didn't think of earlier) for this case.  (... and, IIRC, @sigurdteigen has since found that his use-case is appropriately served by this design after all.)

It remains that, in this function with the type as here defined, this check should be treated as a ProgrammingError(), not a silent failure: in the present design of Queue, it is Wrong to pass NULL as copy.