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 eca22cd5b27..6048cb9b78b 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 @@ -2572,14 +2572,19 @@ public class AST2TemplateTests extends AST2BaseTest { } // template class A; + // template class AI; + // template class U> class AT; // // class B {}; // - // template - // class A {}; + // template class A {}; + // template class AI {}; + // template class U=A> class AT {}; // // A x; - public void _testDefaultTemplateParameter_281781() throws Exception { + // AI y; + // AT z; + public void testDefaultTemplateParameter_281781() throws Exception { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java index 7c123afe76d..022bd59a645 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java @@ -17,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; @@ -37,12 +38,20 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements } public IASTExpression getDefault() { - IASTName name = getPrimaryDeclaration(); - IASTDeclarator dtor = (IASTDeclarator) name.getParent(); - IASTInitializer initializer = dtor.getInitializer(); - if( initializer instanceof IASTInitializerExpression ) - return ((IASTInitializerExpression) initializer).getExpression(); - + IASTName[] nds = getDeclarations(); + if (nds == null || nds.length == 0) + return null; + + for (IASTName name : nds) { + IASTNode parent = name.getParent(); + assert parent instanceof IASTDeclarator; + if (parent instanceof IASTDeclarator) { + IASTDeclarator dtor = (IASTDeclarator) parent; + IASTInitializer initializer = dtor.getInitializer(); + if (initializer instanceof IASTInitializerExpression) + return ((IASTInitializerExpression) initializer).getExpression(); + } + } return null; } 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 eb70eb9d96a..16e30c90055 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 @@ -158,7 +158,7 @@ public abstract class CPPTemplateParameter extends PlatformObject /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations() */ - public IASTNode[] getDeclarations() { + public IASTName[] getDeclarations() { return declarations; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index a8c7e3944ef..ac9bffabeff 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -91,14 +91,19 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement } public IType getDefault() { - IASTNode[] nds = getDeclarations(); + IASTName[] nds = getDeclarations(); if (nds == null || nds.length == 0) return null; - IASTName name = (IASTName) nds[0]; - ICPPASTTemplatedTypeTemplateParameter param = (ICPPASTTemplatedTypeTemplateParameter) name.getParent(); - IASTExpression defaultValue = param.getDefaultValue(); - if (defaultValue != null) - return CPPVisitor.createType(defaultValue); + for (IASTName nd : nds) { + IASTNode parent = nd.getParent(); + assert parent instanceof ICPPASTTemplatedTypeTemplateParameter; + if (parent instanceof ICPPASTTemplatedTypeTemplateParameter) { + ICPPASTTemplatedTypeTemplateParameter param = (ICPPASTTemplatedTypeTemplateParameter) parent; + IASTExpression value = param.getDefaultValue(); + if (value != null) + return CPPVisitor.createType(value); + } + } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java index f0ae2205dac..86352cab75d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java @@ -46,14 +46,19 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements } public IType getDefault() { - IASTNode[] nds = getDeclarations(); + IASTName[] nds = getDeclarations(); if (nds == null || nds.length == 0) return null; - IASTName name = (IASTName) nds[0]; - ICPPASTSimpleTypeTemplateParameter simple = (ICPPASTSimpleTypeTemplateParameter) name.getParent(); - IASTTypeId typeId = simple.getDefaultType(); - if (typeId != null) - return CPPVisitor.createType(typeId); + for (IASTName nd : nds) { + IASTNode parent = nd.getParent(); + assert parent instanceof ICPPASTSimpleTypeTemplateParameter; + if (parent instanceof ICPPASTSimpleTypeTemplateParameter) { + ICPPASTSimpleTypeTemplateParameter simple = (ICPPASTSimpleTypeTemplateParameter) parent; + IASTTypeId typeId = simple.getDefaultType(); + if (typeId != null) + return CPPVisitor.createType(typeId); + } + } return null; }