From 743e00f1abe14f1d13b490d9d2745b2ff0b735c5 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 19 May 2009 13:24:20 +0200
Subject: [PATCH] Improved name substitution.

---
 src/libs/cplusplus/ResolveExpression.cpp | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 09d39b4200e..9a0f16fa317 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -42,6 +42,7 @@
 #include <NameVisitor.h>
 
 #include <QtCore/QList>
+#include <QtCore/QVarLengthArray>
 #include <QtCore/QtDebug>
 
 using namespace CPlusPlus;
@@ -68,13 +69,27 @@ public:
 protected:
     FullySpecifiedType subst(Name *name)
     {
+        if (TemplateNameId *t = name->asTemplateNameId()) {
+            QVarLengthArray<FullySpecifiedType, 8> args(t->templateArgumentCount());
+
+            for (unsigned i = 0; i < t->templateArgumentCount(); ++i)
+                args[i] = subst(t->templateArgumentAt(i));
+
+            TemplateNameId *n = _control->templateNameId(t->identifier(),
+                                                         args.data(), args.size());
+
+            return FullySpecifiedType(_control->namedType(n));
+        } else if (name->isQualifiedNameId()) {
+            // ### implement me
+        }
+
         for (int i = 0; i < _substitution.size(); ++i) {
             const QPair<Name *, FullySpecifiedType> s = _substitution.at(i);
             if (name->isEqualTo(s.first))
                 return s.second;
         }
 
-        return _control->namedType(name);
+        return FullySpecifiedType(_control->namedType(name));
     }
 
     FullySpecifiedType subst(const FullySpecifiedType &ty)
@@ -116,7 +131,10 @@ protected:
     }
 
     virtual void visit(NamedType *ty)
-    { _type.setType(subst(ty->name()).type()); } // ### merge the specifiers
+    {
+        Name *name = ty->name();
+        _type.setType(subst(name).type());
+    }
 
     virtual void visit(Function *ty)
     {
-- 
GitLab