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 5b5b5fefb4e..81fee25b8cd 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 @@ -7271,4 +7271,26 @@ public class AST2TemplateTests extends AST2TestBase { public void testRegression_399829() throws Exception { parseAndCheckBindings(); } + + // template + // struct Bind {}; + // template + // struct Bind_helper { + // typedef Bind type; + // }; + // template + // typename Bind_helper::type + // bind(Func, BoundArgs...); + // struct S { + // template + // void operator()(T, U); + // }; + // int main() { + // S s; + // bind(s, 0, foo); + // } + public void testNPE_401140() throws Exception { + BindingAssertionHelper helper = new BindingAssertionHelper(getAboveComment(), true); + helper.assertProblem("bind(s, 0, foo)", "bind"); + } } 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 0069e6758bf..c1ad1d00893 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 @@ -1103,6 +1103,7 @@ public class CPPTemplates { ICPPTemplateArgument origArg = args[i]; ICPPTemplateArgument newArg; if (origArg.isPackExpansion()) { + ICPPTemplateArgument unexpanded= origArg; origArg= origArg.getExpansionPattern(); int packSize= determinePackSize(origArg, tpMap); if (packSize == PACK_SIZE_FAIL || packSize == PACK_SIZE_NOT_FOUND) { @@ -1118,6 +1119,7 @@ public class CPPTemplates { if (!isValidArgument(newArg)) { if (strict) return null; + result[i + resultShift] = unexpanded; newResult = result; shift = 0; break;