maemo-leste / bugtracker

Issue tracking repository
62 stars 3 forks source link

compiling against qt5 with '-Wcast-align -Werror' causes error [N900] #711

Open aapo opened 9 months ago

aapo commented 9 months ago
sudo apt-get install qtbase5-dev
echo '#include <QInputDialog>' > a.cc

g++ -c -fPIC  -Wcast-align -Werror \
-I/usr/include/arm-linux-gnueabihf/qt5 \
-I/usr/include/arm-linux-gnueabihf/qt5/QtWidgets \
-o object.o a.cc

Causes

In file included from /usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:47,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qtextformat.h:48,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qtextcursor.h:46,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qlineedit.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qinputdialog.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/QInputDialog:1,
                 from a.cc:1:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h: In instantiation of ‘QMapData<Key, T>::Node* QMapData<Key, T>::end() [with Key = QString; T = QVariant; QMapData<Key, T>::Node = QMapNode<QString, QVariant>]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h:1231:27:   required from ‘typename QMap<K, V>::iterator QMultiMap<K, V>::insert(const Key&, const T&) [with Key = QString; T = QVariant; typename QMap<K, V>::iterator = QMap<QString, QVariant>::iterator]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:845:106:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h:212:26: error: cast from ‘QMapNodeBase*’ to ‘QMapData<QString, QVariant>::Node*’ {aka ‘QMapNode<QString, QVariant>*’} increases required alignment of target type [-Werror=cast-align]
  212 |     Node *end() { return reinterpret_cast<Node *>(&header); }
      |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/arm-linux-gnueabihf/qt5/QtCore/qobject.h:49,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qwidget.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qframe.h:44,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qlineedit.h:44,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qinputdialog.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/QInputDialog:1,
                 from a.cc:1:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h: In instantiation of ‘void QList<T>::node_destruct(QList<T>::Node*, QList<T>::Node*) [with T = QVariant]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:921:18:   required from ‘void QList<T>::dealloc(QListData::Data*) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:874:9:   required from ‘QList<T>::~QList() [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:809:30:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:526:34: error: cast from ‘QList<QVariant>::Node*’ to ‘QVariant*’ increases required alignment of target type [-Werror=cast-align]
  526 |         while (from != to) --to, reinterpret_cast<T*>(to)->~T();
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h: In instantiation of ‘void QList<T>::node_copy(QList<T>::Node*, QList<T>::Node*, QList<T>::Node*) [with T = QVariant]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:835:9:   required from ‘void QList<T>::detach_helper(int) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:613:26:   required from ‘void QList<T>::reserve(int) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:810:38:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:505:34: error: cast from ‘QList<QVariant>::Node*’ to ‘QVariant*’ increases required alignment of target type [-Werror=cast-align]
  505 |                 new (current) T(*reinterpret_cast<T*>(src));
      |                                  ^~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:511:18: error: cast from ‘QList<QVariant>::Node*’ to ‘QVariant*’ increases required alignment of target type [-Werror=cast-align]
  511 |                 (reinterpret_cast<T*>(current))->~T();
      |                 ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h: In instantiation of ‘void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = QVariant]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:625:13:   required from ‘void QList<T>::append(const T&) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:402:13:   required from ‘QList<T>& QList<T>::operator<<(const T&) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:812:27:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:471:11: error: cast from ‘QList<QVariant>::Node*’ to ‘QVariant*’ increases required alignment of target type [-Werror=cast-align]
  471 |     else *reinterpret_cast<T*>(n) = t;
      |           ^~~~~~~~~~~~~~~~~~~~~~~
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h: In instantiation of ‘void QList<T>::node_destruct(QList<T>::Node*) [with T = QVariant]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:645:30:   required from ‘void QList<T>::append(const T&) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:402:13:   required from ‘QList<T>& QList<T>::operator<<(const T&) [with T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:812:27:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qlist.h:482:39: error: cast from ‘QList<QVariant>::Node*’ to ‘QVariant*’ increases required alignment of target type [-Werror=cast-align]
  482 |     else if (QTypeInfo<T>::isComplex) reinterpret_cast<T*>(n)->~T();
      |                                       ^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/arm-linux-gnueabihf/qt5/QtCore/qshareddata.h:46,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtCore/qsharedpointer.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qpixmap.h:48,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qbrush.h:52,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qpalette.h:46,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qwidget.h:48,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qframe.h:44,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qlineedit.h:44,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qinputdialog.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/QInputDialog:1,
                 from a.cc:1:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qhash.h: In instantiation of ‘static QHash<K, V>::Node* QHash<K, V>::concrete(QHashData::Node*) [with Key = QString; T = QVariant; QHash<K, V>::Node = QHashNode<QString, QVariant>]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qhash.h:595:13:   required from ‘static void QHash<K, V>::deleteNode2(QHashData::Node*) [with Key = QString; T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qhash.h:619:19:   required from ‘void QHash<K, V>::freeData(QHashData*) [with Key = QString; T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qhash.h:250:37:   required from ‘QHash<K, V>::~QHash() [with Key = QString; T = QVariant]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:826:30:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qhash.h:235:16: error: cast from ‘QHashData::Node*’ to ‘QHash<QString, QVariant>::Node*’ {aka ‘QHashNode<QString, QVariant>*’} increases required alignment of target type [-Werror=cast-align]
  235 |         return reinterpret_cast<Node *>(node);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:47,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qtextformat.h:48,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtGui/qtextcursor.h:46,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qlineedit.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/qinputdialog.h:45,
                 from /usr/include/arm-linux-gnueabihf/qt5/QtWidgets/QInputDialog:1,
                 from a.cc:1:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h: In instantiation of ‘const QMapNode<Key, T>* QMapNode<Key, T>::nextNode() const [with Key = QString; T = QVariant]’:
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h:491:28:   required from ‘QMap<K, V>::const_iterator& QMap<K, V>::const_iterator::operator++() [with Key = QString; T = QVariant]’
/usr/include/c++/10/bits/stl_iterator_base_funcs.h:89:4:   required from ‘constexpr typename std::iterator_traits< <template-parameter-1-1> >::difference_type std::__distance(_InputIterator, _InputIterator, std::input_iterator_tag) [with _InputIterator = QMap<QString, QVariant>::const_iterator; typename std::iterator_traits< <template-parameter-1-1> >::difference_type = int]’
/usr/include/c++/10/bits/stl_iterator_base_funcs.h:141:29:   required from ‘typename std::iterator_traits< <template-parameter-1-1> >::difference_type std::distance(_InputIterator, _InputIterator) [with _InputIterator = QMap<QString, QVariant>::const_iterator; typename std::iterator_traits< <template-parameter-1-1> >::difference_type = int]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmetatype.h:1310:31:   required from ‘static int QtMetaTypePrivate::QAssociativeIterableImpl::sizeImpl(const void*) [with T = QMap<QString, QVariant>]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmetatype.h:1358:68:   required from ‘QtMetaTypePrivate::QAssociativeIterableImpl::QAssociativeIterableImpl(const T*) [with T = QMap<QString, QVariant>]’
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qvariant.h:792:140:   required from here
/usr/include/arm-linux-gnueabihf/qt5/QtCore/qmap.h:115:54: error: cast from ‘const QMapNodeBase*’ to ‘const QMapNode<QString, QVariant>*’ increases required alignment of target type [-Werror=cast-align]
  115 |     inline const QMapNode *nextNode() const { return reinterpret_cast<const QMapNode *>(QMapNodeBase::nextNode()); }
      |                                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

On desktop Linux it works:

g++ -c -fPIC -Wcast-align -Werror -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets  -o object.o a.cc
MerlijnWajer commented 7 months ago

@aapo - sorry for the delayed reply, I don't see anything Maemo specific in the error logs, is it possible the qt versions are different between the desktop linux and your n900/maemo comparison?

aapo commented 7 months ago

Maybe not directly related to Maemo, but something about 32bit arm.

This fails

g++-10 -c -fPIC -Wcast-align -Werror \
-I/usr/include/arm-linux-gnueabihf/qt5 \
-I/usr/include/arm-linux-gnueabihf/qt5/QtWidgets \
-o object.o a.cc

This works

g++-10 -c -fPIC   \
-I/usr/include/arm-linux-gnueabihf/qt5 \
-I/usr/include/arm-linux-gnueabihf/qt5/QtWidgets \
-o object.o a.cc

-- I checked on Maemo-CSSU (with qt5-base-dev from http://repos.fuhlbrueck.net/qt5-maemo5) this works:

g++ -c -fPIC   \
-I/opt/qt5/include \
-I/opt/qt5/include/QtWidgets \
-o object.o a.cc

And this fails:

g++ -c -fPIC  -Wcast-align -Werror \
-I/opt/qt5/include \
-I/opt/qt5/include/QtWidgets \
-o object.o a.cc
IMbackK commented 7 months ago

This seams to simply be a minor bug in qt, not maemo related, this bug should be directed upstream, not here. The reason you get a warning on arm but not x86 is that x86 has no mandatory alignment in pretty much any of its instructions, while arm32 has quite a few