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 88031483a6e..d6afa8b3022 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 @@ -5703,4 +5703,14 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPDeferredClassInstance shortHand= bh.assertNonProblem("derived:", -1); assertTrue(shortHand.getClassTemplate() instanceof ICPPClassTemplatePartialSpecialization); } + + // template class A {}; + // template struct B {}; + // template struct B > { + // typedef int type; + // }; + // typedef B >::type type; // ERROR HERE + public void testPartialClassTemplateSpecUsingDefaultArgument_367997() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java index 600d625863b..ad8ca63cf42 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java @@ -33,17 +33,15 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization { - private ICPPTemplateArgument[] arguments; + private final ICPPTemplateArgument[] arguments; - public CPPClassTemplatePartialSpecialization(ICPPASTTemplateId name) { + public CPPClassTemplatePartialSpecialization(ICPPASTTemplateId name, ICPPTemplateArgument[] arguments) { super(name); + this.arguments= arguments; } @Override public ICPPTemplateArgument[] getTemplateArguments() throws DOMException { - if (arguments == null) { - arguments= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName()); - } return arguments; } 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 c98992db2eb..eb17e322247 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 @@ -677,10 +677,14 @@ public class CPPTemplates { if (argsAreTrivial(classTemplate.getTemplateParameters(), args)) { result= classTemplate; } else { + args= addDefaultArguments(classTemplate, args); + if (args == null) { + return new ProblemBinding(id, IProblemBinding.SEMANTIC_INVALID_TEMPLATE_ARGUMENTS, templateName.toCharArray()); + } ICPPClassTemplatePartialSpecialization partialSpec= findPartialSpecialization(classTemplate, args); if (isDeclaration || isDefinition) { if (partialSpec == null) { - partialSpec = new CPPClassTemplatePartialSpecialization(id); + partialSpec = new CPPClassTemplatePartialSpecialization(id, args); if (template instanceof ICPPInternalClassTemplate) ((ICPPInternalClassTemplate) template).addPartialSpecialization(partialSpec); return partialSpec;