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 870b48cc8dd..252ff695c63 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 @@ -4051,4 +4051,12 @@ public class AST2TemplateTests extends AST2BaseTest { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template struct ST{}; + // template class T> class CT {}; + // typedef CT TDef; + public void testUsingTemplateTemplateParameter_279619() 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/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index 725dcb6c740..a8c7e3944ef 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 @@ -70,13 +70,11 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement if (templateParameters == null) { ICPPASTTemplatedTypeTemplateParameter template = (ICPPASTTemplatedTypeTemplateParameter) getPrimaryDeclaration().getParent(); ICPPASTTemplateParameter[] params = template.getTemplateParameters(); - ICPPTemplateParameter p = null; ICPPTemplateParameter[] result = null; for (ICPPASTTemplateParameter param : params) { IBinding binding = CPPTemplates.getTemplateParameterName(param).resolveBinding(); - p= (ICPPTemplateParameter) binding; - if (p != null) { - result = (ICPPTemplateParameter[]) ArrayUtil.append(ICPPTemplateParameter.class, result, p); + if (binding instanceof ICPPTemplateParameter) { + result = (ICPPTemplateParameter[]) ArrayUtil.append(ICPPTemplateParameter.class, result, binding); } } templateParameters = (ICPPTemplateParameter[]) ArrayUtil.trim(ICPPTemplateParameter.class, result); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index dcaa198e885..8106b9d598f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1981,8 +1981,8 @@ public class CPPTemplates { ab= aParam instanceof ICPPTemplateNonTypeParameter; if (pb != ab) return null; - assert pParam instanceof ICPPTemplateTemplateParameter; // no other choice left - assert aParam instanceof ICPPTemplateTemplateParameter; // no other choice left + assert pb || pParam instanceof ICPPTemplateTemplateParameter; // no other choice left + assert ab || aParam instanceof ICPPTemplateTemplateParameter; // no other choice left } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 18311b5f526..bea77da5047 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -526,7 +526,7 @@ public class CPPVisitor extends ASTQueries { // function type for non-type template parameter ASTNodeProperty prop = parent.getPropertyInParent(); - if (prop == ICPPASTTemplateDeclaration.PARAMETER) { + if (prop == ICPPASTTemplateDeclaration.PARAMETER || prop == ICPPASTTemplatedTypeTemplateParameter.PARAMETER) { return CPPTemplates.createBinding((ICPPASTTemplateParameter) parent); }