From a067fa4afbcb0dab64e36f33613f66f1b42dc0a2 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 1 Dec 2016 03:27:31 -0500 Subject: [PATCH] Bug 508254 - Do not allow instantiation of template with invalid non-type template argument Change-Id: I29472ddda96631147022c4302f9e9b96a1e3d9e6 --- .../parser/tests/ast2/AST2TemplateTests.java | 37 +++++++++++++++++++ .../parser/cpp/semantics/CPPTemplates.java | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) 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 a4d6c3b6ea9..4a7a0e0d3d1 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 @@ -9825,4 +9825,41 @@ public class AST2TemplateTests extends AST2TestBase { // For now, just test that attempting to evaluate doesn't throw an exception. waldo.getInitialValue(); } + + // template + // struct gcd : gcd {}; + // + // template + // struct gcd { + // static constexpr int value = P; + // }; + // + // template + // struct gcd<0, Q> { + // static constexpr int value = Q; + // }; + // + // template + // struct ratio { + // static constexpr int den = D / gcd::value; + // }; + // + // constexpr int foo(int) { + // return 42; + // } + // + // struct S : public ratio {}; + // + // template + // struct ratio_multiply { + // static constexpr int div = gcd<1, R1::den>::value; + // typedef ratio<1, R1::den / div> type; + // }; + // + // typedef ratio_multiply>::type waldo; + public void testOOM_508254() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + // Just check that resolution does not throw an exception. + helper.findName("waldo", 5).resolveBinding(); + } } 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 045d1b90a58..9e9e68b3623 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 @@ -2633,7 +2633,7 @@ public class CPPTemplates { static ICPPTemplateArgument matchTemplateParameterAndArgument(ICPPTemplateDefinition template, ICPPTemplateParameter param, ICPPTemplateArgument arg, CPPTemplateParameterMap map, IASTNode point) { - if (arg == null || !SemanticUtil.isValidType(arg.getTypeValue())) { + if (!isValidArgument(arg)) { return null; } if (param instanceof ICPPTemplateTypeParameter) {