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 d37d82e5161..13b67046e2f 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 @@ -20,6 +20,7 @@ import java.util.Iterator; import junit.framework.TestSuite; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; @@ -2101,32 +2102,23 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue(name.resolveBinding() instanceof IParameter); } - // template + // template // class Allocator { // public: - // typedef _Tp& alloc_reference; - // template + // typedef _TpAllocator& alloc_reference; + // template // struct rebind { - // typedef Allocator<_Tp1> other; + // typedef Allocator<_TpRebind> other; // }; // }; // - // template - // class VecBase { - // public: - // typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; - // }; - // // template > - // class Vec : protected VecBase<_Tp, _Alloc> { + // class Vec { // public: - // typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference; + // typedef typename _Alloc::template rebind<_Tp>::other::alloc_reference reference; // }; // - // class A {}; - // - // void f(Vec::reference r) { - // } + // void f(Vec::reference r) {} public void _testRebindPattern_214447() throws Exception { StringBuffer buffer = getContents(1)[0]; IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); @@ -2134,13 +2126,42 @@ public class AST2TemplateTests extends AST2BaseTest { CPPNameCollector col = new CPPNameCollector(); tu.accept(col); for (IASTName name : col.nameList) { - IBinding b0 = name.resolveBinding(); - System.out.println(name.toString() + ": " + b0.getClass().getName()); if ("r".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); IType type = ((ICPPVariable) b0).getType(); type = CPPSemantics.getUltimateType(type, false); - assertInstance(type, ICPPClassType.class); - assertEquals("A", ((ICPPClassType) type).getName()); + assertInstance(type, IBasicType.class); + assertEquals("int", ASTTypeUtil.getType(type)); + } + } + } + + // template + // class A { + // public: + // typedef _Tp a; + // }; + // + // template > + // class B { + // public: + // typedef _Tp2 b; + // }; + // + // B::b::a x; + public void testDefaultTemplateParameter() throws Exception { + StringBuffer buffer = getContents(1)[0]; + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP, true, true); + + CPPNameCollector col = new CPPNameCollector(); + tu.accept(col); + for (IASTName name : col.nameList) { + if ("x".equals(String.valueOf(name))) { + IBinding b0 = name.resolveBinding(); + IType type = ((ICPPVariable) b0).getType(); + type = CPPSemantics.getUltimateType(type, false); + assertInstance(type, IBasicType.class); + assertEquals("int", ASTTypeUtil.getType(type)); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java index 969dc04ab3f..5278813247a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java @@ -32,15 +32,15 @@ import org.eclipse.core.runtime.PlatformObject; public class CPPTemplateParameter extends PlatformObject implements ICPPTemplateParameter, ICPPInternalBinding { private IASTName [] declarations; - public CPPTemplateParameter( IASTName name ){ + public CPPTemplateParameter(IASTName name) { declarations = new IASTName[] { name }; } - public Object clone(){ + public Object clone() { IType t = null; try { t = (IType) super.clone(); - } catch ( CloneNotSupportedException e ) { + } catch (CloneNotSupportedException e) { //not going to happen } return t; @@ -67,7 +67,7 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate * @see org.eclipse.cdt.core.dom.ast.IBinding#getScope() */ public IScope getScope() { - return CPPVisitor.getContainingScope( getPrimaryDeclaration () ); + return CPPVisitor.getContainingScope(getPrimaryDeclaration ()); } /* (non-Javadoc) @@ -103,7 +103,7 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition() */ public IASTNode getDefinition() { - if( declarations != null && declarations.length > 0 ) + if (declarations != null && declarations.length > 0) return declarations[0]; return null; } @@ -120,26 +120,26 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode) */ public void addDefinition(IASTNode node) { - addDeclaration( node ); + addDeclaration(node); } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode) */ public void addDeclaration(IASTNode node) { - if( !(node instanceof IASTName) ) + if (!(node instanceof IASTName)) return; IASTName name = (IASTName) node; - if( declarations == null ) + if (declarations == null) { declarations = new IASTName[] { name }; - else { - if( declarations.length > 0 && declarations[0] == node ) + } else { + if (declarations.length > 0 && declarations[0] == node) return; //keep the lowest offset declaration in [0] - if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){ - declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name ); + if (declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset()) { + declarations = (IASTName[]) ArrayUtil.prepend(IASTName.class, declarations, name); } else { - declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name ); + declarations = (IASTName[]) ArrayUtil.append(IASTName.class, declarations, name); } } } @@ -150,4 +150,8 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate public ILinkage getLinkage() { return Linkage.CPP_LINKAGE; } + + public String toString() { + return getName(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java index f4adcad5cc9..66f806e3728 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java @@ -1618,6 +1618,10 @@ public class CPPTemplates { if( map.containsKey( defaultType ) ){ arg = (IType) map.get( defaultType ); } + } else if (defaultType instanceof ICPPInternalDeferredClassInstance) { + // Default template parameter may be depend on a previously defined + // parameter: template > class B {}; + arg = ((ICPPInternalDeferredClassInstance) defaultType).instantiate(map); } else { arg = defaultType; }