From 02f68822d7cfa18d44d484ea156618701601c3e2 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 25 Mar 2010 12:56:05 -0300 Subject: Fixes attributes for default constructors and class' "isPolymorphic" flag. When a class has no constructor explicitly declared a default is provided by API Extractor, but it should be marked as "Final". The setting of the "isPolymorphic" flag done in the AbstractMetaClass::addFunction method must take into account if the class has a virtual destructor, as it is done in the AbstractMetaClass::setFunctions method. The already existing tests cover the cases affected by the changes. --- abstractmetalang.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'abstractmetalang.cpp') diff --git a/abstractmetalang.cpp b/abstractmetalang.cpp index b9a15d426..666101719 100644 --- a/abstractmetalang.cpp +++ b/abstractmetalang.cpp @@ -1270,8 +1270,8 @@ void AbstractMetaClass::setFunctions(const AbstractMetaFunctionList &functions) f->setOwnerClass(this); m_hasVirtualSlots = m_hasVirtualSlots || f->isVirtualSlot(); - m_hasVirtuals = m_hasVirtuals || !f->isFinal() || f->isVirtualSlot(); - m_isPolymorphic = m_isPolymorphic || m_hasVirtuals || hasVirtualDestructor(); + m_hasVirtuals = m_hasVirtuals || !f->isFinal() || f->isVirtualSlot() || hasVirtualDestructor(); + m_isPolymorphic = m_isPolymorphic || m_hasVirtuals; m_hasNonpublic = m_hasNonpublic || !f->isPublic(); // If we have non-virtual overloads of a virtual function, we have to implement @@ -1327,7 +1327,7 @@ void AbstractMetaClass::addFunction(AbstractMetaFunction *function) m_functions << function; m_hasVirtualSlots |= function->isVirtualSlot(); - m_hasVirtuals |= !function->isFinal() || function->isVirtualSlot(); + m_hasVirtuals |= !function->isFinal() || function->isVirtualSlot() || hasVirtualDestructor(); m_isPolymorphic |= m_hasVirtuals; m_hasNonpublic |= !function->isPublic(); } @@ -1563,6 +1563,7 @@ void AbstractMetaClass::addDefaultConstructor() uint attr = AbstractMetaAttributes::Native; attr |= AbstractMetaAttributes::Public; + attr |= AbstractMetaAttributes::Final; f->setAttributes(attr); f->setImplementingClass(this); f->setOriginalAttributes(f->attributes()); -- cgit v1.2.3