diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2015-03-30 22:13:44 +0300 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2015-04-28 13:54:25 +0000 |
commit | ad4cb444fbfd1f3f4747a0988a196120d3a0c208 (patch) | |
tree | 966257fbdeb49f3a5ed1e445fb3cf62886159515 /src/libs/cplusplus/ResolveExpression.cpp | |
parent | aa893918c1a51cb20c909a4c32e401c6d2d254c0 (diff) |
C++: Fix specialization resolution for nested types
Use-cases:
template<typename T>
struct Traits { typedef typename T::pointer pointer; };
template<typename _Tp>
struct Traits<_Tp*> { typedef _Tp *pointer; };
struct Foo { int bar; };
// 1
template<typename T>
class Temp
{
protected:
typedef Traits<T> TraitsT;
public:
typedef typename TraitsT::pointer pointer;
pointer p;
};
void func()
{
Temp<Foo *> t;
t.p-> // complete
}
// 2
class Temp2
{
protected:
typedef Foo *FooPtr;
typedef Traits<FooPtr> TraitsT;
public:
typedef typename TraitsT::pointer pointer;
pointer p;
};
void func2()
{
Temp2 t;
t.p-> // complete
}
Task-number: QTCREATORBUG-14141
Change-Id: Id3459671117c0c81bcde7c9714b42750634c0225
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 0a261c50d40..824e1770119 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -787,7 +787,7 @@ bool ResolveExpression::visit(ArrayAccessAST *ast) FullySpecifiedType ty = result.type().simplified(); Scope *scope = result.scope(); - TypeResolver typeResolver(_context); + TypeResolver typeResolver(*_context.bindings()); typeResolver.resolve(&ty, &scope, result.binding()); if (PointerType *ptrTy = ty->asPointerType()) { @@ -916,7 +916,7 @@ LookupScope *ResolveExpression::baseExpression(const QList<LookupItem> &baseResu if (Q_UNLIKELY(debug)) qDebug() << "In ResolveExpression::baseExpression with" << baseResults.size() << "results..."; int i = 0; - TypeResolver typeResolver(_context); + TypeResolver typeResolver(*_context.bindings()); foreach (const LookupItem &r, baseResults) { if (!r.type().type() || !r.scope()) |