[Development] Compiler bug in Clang 3.4 with precompiled header with QueuedConnection

Olivier Goffart olivier at woboq.com
Mon Jul 21 23:12:04 CEST 2014


Hi,

I just debugged a quite weird bug with QueuedConnection and foinction pointer 
base connection. 

There is a compiler bug in clang 3.4 with precompiled header.
Normally, a static variable within a template should have a different address 
for different template parameters .
In other words:
template<typename T> int *foo() { static int i; return &i; }
so foo<int>() != foo<double>()

However, if foo is in a precompiled header, this is not the case.

And this breaks the detection of the QMetaType for the QueuedConnection since 
we rely on static variables different for each types.
http://code.woboq.org/qt5/qtbase/src/corelib/kernel/qobject_impl.h.html#105

As a result, Qt believe the metatypes are not what they are, resulting in 
wrong type conversions, and weird crash when the event is received.

The bug is fixed in Clang 3.5. (not released yet)
I don't know if it was present in earlier version of clang.

Should precompiled header be disabled by default for this compiler version?

-- 
Olivier 

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: t.cpp
Type: text/x-c++src
Size: 173 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20140721/b7587d05/attachment.cpp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: t.h
Type: text/x-chdr
Size: 144 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20140721/b7587d05/attachment.h>


More information about the Development mailing list