diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2016-07-07 10:57:03 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2016-07-12 06:38:56 +0000 |
commit | d91d3536eb82075aec25f3772c4209e15b7b3060 (patch) | |
tree | 3e78419f4e2bd9e038ff2e1fa5d6639cc4b26d77 /src/xmlpatterns | |
parent | 71ca09a07d1b5adf3eeefd3790250481781ba166 (diff) | |
download | qtxmlpatterns-d91d3536eb82075aec25f3772c4209e15b7b3060.tar.gz |
Unbreak ubsan developer-build
GCC's undefined-behavior sanitizer checks that the
declared type of the object is a base class of the
dynamic type of the object on each access to a
member of a class type.
It therefore requires the typeinfo for these types,
which for polymorphic types is emitted in the TU
where the vtable is emitted, too.
QtPatternist::AtomicValue is a polymorphic non-
exported class, so this failed at link-time. Ditto
for the other cases.
Fix by autotest-exporting the classes.
Also, where applicable, de-inline the dtors, so the
vtable (and typeinfo) are pinned to one TU.
Change-Id: I5c47be779a3833433a7108a79a57d61a93ab5494
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/xmlpatterns')
-rw-r--r-- | src/xmlpatterns/data/qitem_p.h | 3 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qgeneralcomparison.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qgeneralcomparison_p.h | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qnamespaceconstructor.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qnamespaceconstructor_p.h | 3 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qpath.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qpath_p.h | 3 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qsinglecontainer.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qsinglecontainer_p.h | 4 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qtemplate.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qtemplate_p.h | 4 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qvaluecomparison.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qvaluecomparison_p.h | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qvariablereference.cpp | 5 | ||||
-rw-r--r-- | src/xmlpatterns/expr/qvariablereference_p.h | 3 | ||||
-rw-r--r-- | src/xmlpatterns/functions/qfunctionfactory_p.h | 2 | ||||
-rw-r--r-- | src/xmlpatterns/type/qitemtype_p.h | 2 | ||||
-rw-r--r-- | src/xmlpatterns/type/qsequencetype_p.h | 2 |
18 files changed, 56 insertions, 15 deletions
diff --git a/src/xmlpatterns/data/qitem_p.h b/src/xmlpatterns/data/qitem_p.h index c89add1..c5a168d 100644 --- a/src/xmlpatterns/data/qitem_p.h +++ b/src/xmlpatterns/data/qitem_p.h @@ -105,8 +105,7 @@ namespace QPatternist * @ingroup Patternist_xdm * @author Frans Englich <frans.englich@nokia.com> */ - class AtomicValue : public QSharedData - , public CppCastingHelper<AtomicValue> + class Q_AUTOTEST_EXPORT AtomicValue : public QSharedData, public CppCastingHelper<AtomicValue> { public: virtual ~AtomicValue(); diff --git a/src/xmlpatterns/expr/qgeneralcomparison.cpp b/src/xmlpatterns/expr/qgeneralcomparison.cpp index d11b130..1c2ca4c 100644 --- a/src/xmlpatterns/expr/qgeneralcomparison.cpp +++ b/src/xmlpatterns/expr/qgeneralcomparison.cpp @@ -56,6 +56,11 @@ GeneralComparison::GeneralComparison(const Expression::Ptr &op1, { } +/*! \internal */ +GeneralComparison::~GeneralComparison() +{ +} + bool GeneralComparison::generalCompare(const Item &op1, const Item &op2, const DynamicContext::Ptr &context) const diff --git a/src/xmlpatterns/expr/qgeneralcomparison_p.h b/src/xmlpatterns/expr/qgeneralcomparison_p.h index f4bbed3..6a66fa9 100644 --- a/src/xmlpatterns/expr/qgeneralcomparison_p.h +++ b/src/xmlpatterns/expr/qgeneralcomparison_p.h @@ -64,8 +64,8 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class GeneralComparison : public PairContainer, - public ComparisonPlatform<GeneralComparison, + class Q_AUTOTEST_EXPORT GeneralComparison + : public PairContainer, public ComparisonPlatform<GeneralComparison, true /* We want to report errors. */, AtomicComparator::AsGeneralComparison> { @@ -74,6 +74,7 @@ namespace QPatternist const AtomicComparator::Operator op, const Expression::Ptr &op2, const bool isBackwardsCompat = false); + ~GeneralComparison(); virtual bool evaluateEBV(const DynamicContext::Ptr &) const; virtual Expression::Ptr typeCheck(const StaticContext::Ptr &context, diff --git a/src/xmlpatterns/expr/qnamespaceconstructor.cpp b/src/xmlpatterns/expr/qnamespaceconstructor.cpp index b9ed98b..882f9c0 100644 --- a/src/xmlpatterns/expr/qnamespaceconstructor.cpp +++ b/src/xmlpatterns/expr/qnamespaceconstructor.cpp @@ -44,6 +44,11 @@ NamespaceConstructor::NamespaceConstructor(const QXmlName nb) : m_binding(nb) Q_ASSERT(!m_binding.isNull()); } +/*! \internal */ +NamespaceConstructor::~NamespaceConstructor() +{ +} + void NamespaceConstructor::evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const { context->outputReceiver()->namespaceBinding(m_binding); diff --git a/src/xmlpatterns/expr/qnamespaceconstructor_p.h b/src/xmlpatterns/expr/qnamespaceconstructor_p.h index 1ac1b5d..6a025a1 100644 --- a/src/xmlpatterns/expr/qnamespaceconstructor_p.h +++ b/src/xmlpatterns/expr/qnamespaceconstructor_p.h @@ -57,10 +57,11 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class NamespaceConstructor : public EmptyContainer + class Q_AUTOTEST_EXPORT NamespaceConstructor : public EmptyContainer { public: NamespaceConstructor(const QXmlName nb); + ~NamespaceConstructor(); virtual void evaluateToSequenceReceiver(const DynamicContext::Ptr &context) const; diff --git a/src/xmlpatterns/expr/qpath.cpp b/src/xmlpatterns/expr/qpath.cpp index 4d1e42c..0128cf3 100644 --- a/src/xmlpatterns/expr/qpath.cpp +++ b/src/xmlpatterns/expr/qpath.cpp @@ -55,6 +55,11 @@ Path::Path(const Expression::Ptr &operand1, { } +/*! \internal */ +Path::~Path() +{ +} + Item::Iterator::Ptr Path::mapToSequence(const Item &item, const DynamicContext::Ptr &context) const { diff --git a/src/xmlpatterns/expr/qpath_p.h b/src/xmlpatterns/expr/qpath_p.h index 687fafb..51b5728 100644 --- a/src/xmlpatterns/expr/qpath_p.h +++ b/src/xmlpatterns/expr/qpath_p.h @@ -59,7 +59,7 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class Path : public PairContainer + class Q_AUTOTEST_EXPORT Path : public PairContainer { public: enum Kind @@ -88,6 +88,7 @@ namespace QPatternist Path(const Expression::Ptr &operand1, const Expression::Ptr &operand2, const Kind kind = RegularPath); + ~Path(); virtual Item::Iterator::Ptr evaluateSequence(const DynamicContext::Ptr &context) const; virtual Item evaluateSingleton(const DynamicContext::Ptr &context) const; diff --git a/src/xmlpatterns/expr/qsinglecontainer.cpp b/src/xmlpatterns/expr/qsinglecontainer.cpp index c973313..bf544ab 100644 --- a/src/xmlpatterns/expr/qsinglecontainer.cpp +++ b/src/xmlpatterns/expr/qsinglecontainer.cpp @@ -45,6 +45,11 @@ SingleContainer::SingleContainer(const Expression::Ptr &operand) : m_operand(ope Q_ASSERT(operand); } +/*! \internal */ +SingleContainer::~SingleContainer() +{ +} + Expression::List SingleContainer::operands() const { Expression::List list; diff --git a/src/xmlpatterns/expr/qsinglecontainer_p.h b/src/xmlpatterns/expr/qsinglecontainer_p.h index baf061c..3dbfb80 100644 --- a/src/xmlpatterns/expr/qsinglecontainer_p.h +++ b/src/xmlpatterns/expr/qsinglecontainer_p.h @@ -56,9 +56,11 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class SingleContainer : public Expression + class Q_AUTOTEST_EXPORT SingleContainer : public Expression { public: + ~SingleContainer(); + virtual Expression::List operands() const; virtual void setOperands(const Expression::List &operands); diff --git a/src/xmlpatterns/expr/qtemplate.cpp b/src/xmlpatterns/expr/qtemplate.cpp index a5cd165..3d5d948 100644 --- a/src/xmlpatterns/expr/qtemplate.cpp +++ b/src/xmlpatterns/expr/qtemplate.cpp @@ -40,6 +40,11 @@ QT_BEGIN_NAMESPACE using namespace QPatternist; +/*! \internal */ +Template::~Template() +{ +} + const SourceLocationReflection* Template::actualReflection() const { return this; diff --git a/src/xmlpatterns/expr/qtemplate_p.h b/src/xmlpatterns/expr/qtemplate_p.h index 2cc0eba..84669a8 100644 --- a/src/xmlpatterns/expr/qtemplate_p.h +++ b/src/xmlpatterns/expr/qtemplate_p.h @@ -72,8 +72,7 @@ namespace QPatternist * @ingroup Patternist_expressions * @since 4.5 */ - class Template : public QSharedData - , public SourceLocationReflection + class Q_AUTOTEST_EXPORT Template : public QSharedData, public SourceLocationReflection { public: @@ -85,6 +84,7 @@ namespace QPatternist , m_reqType(reqType) { } + ~Template(); Expression::Ptr body; diff --git a/src/xmlpatterns/expr/qvaluecomparison.cpp b/src/xmlpatterns/expr/qvaluecomparison.cpp index 09ecfef..1726666 100644 --- a/src/xmlpatterns/expr/qvaluecomparison.cpp +++ b/src/xmlpatterns/expr/qvaluecomparison.cpp @@ -51,6 +51,11 @@ ValueComparison::ValueComparison(const Expression::Ptr &op1, { } +/*! \internal */ +ValueComparison::~ValueComparison() +{ +} + Item ValueComparison::evaluateSingleton(const DynamicContext::Ptr &context) const { const Item it1(m_operand1->evaluateSingleton(context)); diff --git a/src/xmlpatterns/expr/qvaluecomparison_p.h b/src/xmlpatterns/expr/qvaluecomparison_p.h index c65c74a..37dd3a7 100644 --- a/src/xmlpatterns/expr/qvaluecomparison_p.h +++ b/src/xmlpatterns/expr/qvaluecomparison_p.h @@ -64,13 +64,14 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class ValueComparison : public PairContainer, - public ComparisonPlatform<ValueComparison, true> + class Q_AUTOTEST_EXPORT ValueComparison + : public PairContainer, public ComparisonPlatform<ValueComparison, true> { public: ValueComparison(const Expression::Ptr &op1, const AtomicComparator::Operator op, const Expression::Ptr &op2); + ~ValueComparison(); virtual Item evaluateSingleton(const DynamicContext::Ptr &) const; diff --git a/src/xmlpatterns/expr/qvariablereference.cpp b/src/xmlpatterns/expr/qvariablereference.cpp index ed5ba36..e2c5548 100644 --- a/src/xmlpatterns/expr/qvariablereference.cpp +++ b/src/xmlpatterns/expr/qvariablereference.cpp @@ -42,6 +42,11 @@ VariableReference::VariableReference(const VariableSlotID slotP) : m_varSlot(slo Q_ASSERT(m_varSlot > -1); } +/*! \internal */ +VariableReference::~VariableReference() +{ +} + Expression::Properties VariableReference::properties() const { return DisableElimination; diff --git a/src/xmlpatterns/expr/qvariablereference_p.h b/src/xmlpatterns/expr/qvariablereference_p.h index d8676a6..1ca6ade 100644 --- a/src/xmlpatterns/expr/qvariablereference_p.h +++ b/src/xmlpatterns/expr/qvariablereference_p.h @@ -58,7 +58,7 @@ namespace QPatternist * @author Frans Englich <frans.englich@nokia.com> * @ingroup Patternist_expressions */ - class VariableReference : public EmptyContainer + class Q_AUTOTEST_EXPORT VariableReference : public EmptyContainer { public: typedef QExplicitlySharedDataPointer<VariableReference> Ptr; @@ -70,6 +70,7 @@ namespace QPatternist * @param slot must be a valid slot. That is, zero or larger. */ VariableReference(const VariableSlotID slot); + ~VariableReference(); /** * @returns the slot that this reference communicates through. diff --git a/src/xmlpatterns/functions/qfunctionfactory_p.h b/src/xmlpatterns/functions/qfunctionfactory_p.h index 187edad..5759ac0 100644 --- a/src/xmlpatterns/functions/qfunctionfactory_p.h +++ b/src/xmlpatterns/functions/qfunctionfactory_p.h @@ -68,7 +68,7 @@ namespace QPatternist * Language (XPath) 2.0, Definition: Function signatures</a> * @author Frans Englich <frans.englich@nokia.com> */ - class FunctionFactory : public QSharedData + class Q_AUTOTEST_EXPORT FunctionFactory : public QSharedData { public: diff --git a/src/xmlpatterns/type/qitemtype_p.h b/src/xmlpatterns/type/qitemtype_p.h index bea6bc2..7cfad06 100644 --- a/src/xmlpatterns/type/qitemtype_p.h +++ b/src/xmlpatterns/type/qitemtype_p.h @@ -69,7 +69,7 @@ namespace QPatternist * @ingroup Patternist_types * @author Frans Englich <frans.englich@nokia.com> */ - class ItemType : public virtual QSharedData + class Q_AUTOTEST_EXPORT ItemType : public virtual QSharedData { public: /** diff --git a/src/xmlpatterns/type/qsequencetype_p.h b/src/xmlpatterns/type/qsequencetype_p.h index 0828d58..870972a 100644 --- a/src/xmlpatterns/type/qsequencetype_p.h +++ b/src/xmlpatterns/type/qsequencetype_p.h @@ -69,7 +69,7 @@ namespace QPatternist * @see <a href="http://www.w3.org/TR/xpath20/#id-sequencetype-syntax">XML * Path Language (XPath) 2.0, 2.5.3 SequenceType Syntax</a> */ - class SequenceType : public virtual QSharedData + class Q_AUTOTEST_EXPORT SequenceType : public virtual QSharedData { public: inline SequenceType() |