False warning in recent clang

Hi all,

After recent clang update I'm getting new warnings from Qt headers:

/usr/local/Trolltech/Qt-4.8.0/include/QtCore/qsharedpointer_impl.h:595:43: warning: field is uninitialized when used here [-Wuninitialized]
    inline QWeakPointer(X *ptr) : d(ptr ? d->getAndRef(ptr) : 0), value(ptr)

(caret is pointing at 'd' before '->getAndRef')

Here is complete piece of subject code:

template <class X>
inline QWeakPointer(X *ptr) : d(ptr ? d->getAndRef(ptr) : 0), value(ptr)
{ }

where getAndRef is static method, so value of d is not needed here. I assume this warning should not be emitted.

The warning seems valid, and the code should be fixed.
d->getAndRef(ptr) requires that d be evaluated even if getAndRef is
static, just as f()->getAndRef(ptr) would be required to call f(),
even though the result would be discarded.

-- James

Yes, the base expression must be evaluated, meaning that the pointer value must be loaded; however, since that value is immediately ignored, this is innocuous, and no undefined behavior is invoked.


This looks like the result of r158477 which extended the -Wuninitialized checking on field initializers. This only happens when dereferencing pointers. If d was a class instead of a pointer to a class, this warning would not have triggered. It should be possible to special case this during the field check to ignore static calls on a dereferenced pointer.

FYI, this is PR13127.