summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-03-20 13:48:20 +0100
committerErik Verbruggen <erik.verbruggen@digia.com>2013-05-03 10:56:26 +0200
commit8e18adc70f4ea49eb1e20976220d79874228257d (patch)
treecbdc3f9876bae0610e6eb3282b6baf6c6300ef86 /src/libs/cplusplus/LookupContext.cpp
parent6999e3c33907c0b4b09902f18dee0407c6d6293e (diff)
downloadqt-creator-8e18adc70f4ea49eb1e20976220d79874228257d.tar.gz
C++: Fix crash in code completion.
Caused by a dangling pointer of a template instantiation which had been cloned into the wrong control. The fix is to remove that control and refer to the control of the bindings (which is the correct one). Change-Id: I951a60f2e613aae1e4ac901ce99c820212018709 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp55
1 files changed, 21 insertions, 34 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index d0041d9537..a8a65fd7b8 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -151,47 +151,42 @@ uint qHash(const FullyQualifiedName &fullyQualifiedName)
// LookupContext
/////////////////////////////////////////////////////////////////////
LookupContext::LookupContext()
- : _control(new Control())
- , m_expandTemplates(false)
+ : m_expandTemplates(false)
{ }
LookupContext::LookupContext(Document::Ptr thisDocument,
const Snapshot &snapshot)
- : _expressionDocument(Document::create(QLatin1String("<LookupContext>"))),
- _thisDocument(thisDocument),
- _snapshot(snapshot),
- _control(new Control()),
- m_expandTemplates(false)
+ : _expressionDocument(Document::create(QLatin1String("<LookupContext>")))
+ , _thisDocument(thisDocument)
+ , _snapshot(snapshot)
+ , m_expandTemplates(false)
{
}
LookupContext::LookupContext(Document::Ptr expressionDocument,
Document::Ptr thisDocument,
const Snapshot &snapshot)
- : _expressionDocument(expressionDocument),
- _thisDocument(thisDocument),
- _snapshot(snapshot),
- _control(new Control()),
- m_expandTemplates(false)
+ : _expressionDocument(expressionDocument)
+ , _thisDocument(thisDocument)
+ , _snapshot(snapshot)
+ , m_expandTemplates(false)
{
}
LookupContext::LookupContext(const LookupContext &other)
- : _expressionDocument(other._expressionDocument),
- _thisDocument(other._thisDocument),
- _snapshot(other._snapshot),
- _bindings(other._bindings),
- _control(other._control),
- m_expandTemplates(other.m_expandTemplates)
+ : _expressionDocument(other._expressionDocument)
+ , _thisDocument(other._thisDocument)
+ , _snapshot(other._snapshot)
+ , _bindings(other._bindings)
+ , m_expandTemplates(other.m_expandTemplates)
{ }
-LookupContext &LookupContext::operator = (const LookupContext &other)
+LookupContext &LookupContext::operator=(const LookupContext &other)
{
_expressionDocument = other._expressionDocument;
_thisDocument = other._thisDocument;
_snapshot = other._snapshot;
_bindings = other._bindings;
- _control = other._control;
m_expandTemplates = other.m_expandTemplates;
return *this;
}
@@ -250,7 +245,7 @@ const Name *LookupContext::minimalName(Symbol *symbol, ClassOrNamespace *target,
QSharedPointer<CreateBindings> LookupContext::bindings() const
{
if (! _bindings) {
- _bindings = QSharedPointer<CreateBindings>(new CreateBindings(_thisDocument, _snapshot, control()));
+ _bindings = QSharedPointer<CreateBindings>(new CreateBindings(_thisDocument, _snapshot));
_bindings->setExpandTemplates(m_expandTemplates);
}
@@ -262,11 +257,6 @@ void LookupContext::setBindings(QSharedPointer<CreateBindings> bindings)
_bindings = bindings;
}
-QSharedPointer<Control> LookupContext::control() const
-{
- return _control;
-}
-
Document::Ptr LookupContext::expressionDocument() const
{ return _expressionDocument; }
@@ -649,7 +639,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
}
if (templateId && (s->isDeclaration() || s->isFunction())) {
- FullySpecifiedType ty = DeprecatedGenTemplateInstance::instantiate(templateId, s, _control);
+ FullySpecifiedType ty = DeprecatedGenTemplateInstance::instantiate(templateId, s, control());
item.setType(ty); // override the type.
}
@@ -1215,8 +1205,10 @@ ClassOrNamespace *ClassOrNamespace::findOrCreateType(const Name *name, ClassOrNa
return 0;
}
-CreateBindings::CreateBindings(Document::Ptr thisDocument, const Snapshot &snapshot, QSharedPointer<Control> control)
- : _snapshot(snapshot), _control(control), _expandTemplates(false)
+CreateBindings::CreateBindings(Document::Ptr thisDocument, const Snapshot &snapshot)
+ : _snapshot(snapshot)
+ , _control(QSharedPointer<Control>(new Control))
+ , _expandTemplates(false)
{
_globalNamespace = allocClassOrNamespace(/*parent = */ 0);
_currentClassOrNamespace = _globalNamespace;
@@ -1277,11 +1269,6 @@ void CreateBindings::process(Symbol *symbol)
_currentClassOrNamespace->addTodo(symbol);
}
-QSharedPointer<Control> CreateBindings::control() const
-{
- return _control;
-}
-
ClassOrNamespace *CreateBindings::allocClassOrNamespace(ClassOrNamespace *parent)
{
ClassOrNamespace *e = new ClassOrNamespace(this, parent);