diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 73c8603dc0c..98f85fb0796 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -4816,8 +4816,26 @@ public class AST2CPPTests extends AST2BaseTest { // template class char_traits {}; // template > class basic_string {}; // + // template + // struct iterator_traits { + // typedef typename _Iterator::reference reference; + // }; + // + // template + // struct iterator_traits<_Tp*> { + // typedef _Tp& reference; + // }; + // + // template + // struct normal_iterator { + // typedef iterator_traits<_Iterator> traits_type; + // typedef typename traits_type::reference reference; + // reference operator*() const; + // }; + // // template struct vector { - // typedef T* iterator; + // typedef T* pointer; + // typedef normal_iterator iterator; // iterator begin(); // iterator end(); // }; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java index 74ba0fd6340..8f619a4e91b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java @@ -30,6 +30,7 @@ public class CPPTemplateTypeArgument implements ICPPTemplateArgument { public CPPTemplateTypeArgument(IType simplifiedType, IType originalType) { Assert.isNotNull(simplifiedType); + Assert.isNotNull(originalType); fType= simplifiedType; fOriginalType= originalType; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java index 8b09603afdd..2c9c5c2fad9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java @@ -678,11 +678,12 @@ public class TemplateArgumentDeduction { return tval.equals(sval); } - return fromType(p.getTypeValue(), a.getTypeValue(), false, point); + return fromType(p.getTypeValue(), a.getOriginalTypeValue(), false, point); } private boolean fromType(IType p, IType a, boolean allowCVQConversion, IASTNode point) throws DOMException { while (p != null) { + IType argyumentTypeBeforeTypedefResolution = a; while (a instanceof ITypedef) a = ((ITypedef) a).getType(); if (p instanceof IBasicType) { @@ -775,7 +776,7 @@ public class TemplateArgumentDeduction { } if (a == null) return false; - return deduce(((ICPPTemplateParameter)p).getParameterID(), new CPPTemplateTypeArgument(a)); + return deduce(((ICPPTemplateParameter) p).getParameterID(), new CPPTemplateTypeArgument(a, argyumentTypeBeforeTypedefResolution)); } else if (p instanceof ICPPTemplateInstance) { if (!(a instanceof ICPPTemplateInstance)) return false;