diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index f0dea6d3d14..2a88ba5a8de 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -6726,7 +6726,52 @@ public class AST2TemplateTests extends AST2BaseTest { // void test(E>::type v) { // f(v); // } - public void testAliasTemplate_395026() throws Exception { + public void testAliasTemplate_395026_1() throws Exception { + parseAndCheckBindings(); + } + + // template + // struct A { + // template + // struct rebind { + // typedef A other; + // }; + // }; + // + // template + // struct B { + // typedef typename T::template rebind::other type1; + // }; + // + // template + // struct C { + // template + // using rebind2 = typename B::type1; + // }; + // + // template + // struct D : C { + // typedef int* type0; + // template + // struct rebind { + // typedef typename C::template rebind2 other; + // }; + // }; + // + // template + // struct E { + // typedef typename D>::template rebind::other type2; + // typedef typename D::type0 type; + // type operator[](int n); + // }; + // + // void f(int); + // + // void test() { + // E v; + // f(*v[0]); + // } + public void testAliasTemplate_395026_2() throws Exception { parseAndCheckBindings(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java index 4435b4020dc..806301c5257 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPAliasTemplateInstance.java @@ -8,6 +8,7 @@ * * Contributors: * Thomas Corbat (IFS) - Initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -22,21 +23,22 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; +import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.PlatformObject; public class CPPAliasTemplateInstance extends PlatformObject - implements ICPPAliasTemplateInstance, ISerializableType { + implements ICPPAliasTemplateInstance, ITypeContainer, ISerializableType { private final char[] name; - private final IType aliasedType; private final ICPPAliasTemplate aliasTemplate; + private IType aliasedType; public CPPAliasTemplateInstance(char[] name, IType aliasedType, ICPPAliasTemplate aliasTemplate) { this.name = name; - this.aliasedType = aliasedType; this.aliasTemplate = aliasTemplate; + this.aliasedType = aliasedType; } @Override @@ -59,6 +61,11 @@ public class CPPAliasTemplateInstance extends PlatformObject return aliasedType; } + @Override + public void setType(IType type) { + aliasedType = type; + } + @Override public Object clone() { try {