forked from qt-creator/qt-creator
		
	Fix crashes when cyclic inheritance
Task-number: QTCREATORBUG-7933 Change-Id: I98469a092ff3ff0acc69800e9aade4ebb268332a Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
		
				
					committed by
					
						
						Erik Verbruggen
					
				
			
			
				
	
			
			
			
						parent
						
							8dc234c171
						
					
				
				
					commit
					fbb756cdcc
				
			@@ -708,11 +708,22 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
 | 
			
		||||
    if (!referenceClass)
 | 
			
		||||
        return reference;
 | 
			
		||||
 | 
			
		||||
    const TemplateNameId *templId = name->asTemplateNameId();
 | 
			
		||||
    if (_alreadyConsideredClasses.contains(referenceClass) ||
 | 
			
		||||
            (templId &&
 | 
			
		||||
            _alreadyConsideredTemplates.contains(templId))) {
 | 
			
		||||
            return reference;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!name->isTemplateNameId())
 | 
			
		||||
        _alreadyConsideredClasses.insert(referenceClass);
 | 
			
		||||
 | 
			
		||||
    QSet<ClassOrNamespace *> knownUsings = reference->usings().toSet();
 | 
			
		||||
 | 
			
		||||
    // If we are dealling with a template type, more work is required, since we need to
 | 
			
		||||
    // construct all instantiation data.
 | 
			
		||||
    if (const TemplateNameId *templId = name->asTemplateNameId()) {
 | 
			
		||||
    if (templId) {
 | 
			
		||||
        _alreadyConsideredTemplates.insert(templId);
 | 
			
		||||
        ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(reference);
 | 
			
		||||
        instantiation->_templateId = templId;
 | 
			
		||||
        instantiation->_instantiationOrigin = origin;
 | 
			
		||||
@@ -786,6 +797,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        _alreadyConsideredTemplates.clear(templId);
 | 
			
		||||
        return instantiation;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -828,6 +840,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _alreadyConsideredClasses.clear(referenceClass);
 | 
			
		||||
    return reference;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -45,6 +45,33 @@
 | 
			
		||||
namespace CPlusPlus {
 | 
			
		||||
 | 
			
		||||
class CreateBindings;
 | 
			
		||||
class Class;
 | 
			
		||||
template<typename T>
 | 
			
		||||
class AlreadyConsideredClassContainer
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    AlreadyConsideredClassContainer() : _class(0) {}
 | 
			
		||||
    void insert(const T *item)
 | 
			
		||||
    {
 | 
			
		||||
        if (_container.isEmpty())
 | 
			
		||||
            _class = item;
 | 
			
		||||
        _container.insert(item);
 | 
			
		||||
    }
 | 
			
		||||
    bool contains(const T *item)
 | 
			
		||||
    {
 | 
			
		||||
        return _container.contains(item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void clear(const T *item)
 | 
			
		||||
    {
 | 
			
		||||
        if (_class != item)
 | 
			
		||||
            _container.clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QSet<const T *> _container;
 | 
			
		||||
    const T * _class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CPLUSPLUS_EXPORT ClassOrNamespace
 | 
			
		||||
{
 | 
			
		||||
@@ -112,6 +139,9 @@ private:
 | 
			
		||||
    const TemplateNameId *_templateId;
 | 
			
		||||
    ClassOrNamespace *_instantiationOrigin;
 | 
			
		||||
 | 
			
		||||
    AlreadyConsideredClassContainer<Class> _alreadyConsideredClasses;
 | 
			
		||||
    AlreadyConsideredClassContainer<TemplateNameId> _alreadyConsideredTemplates;
 | 
			
		||||
 | 
			
		||||
    friend class CreateBindings;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user