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 f0a13482154..0fae04febd6 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 @@ -10434,4 +10434,34 @@ public class AST2TemplateTests extends AST2CPPTestBase { assertNotNull(problem); assertEquals(IProblem.TEMPLATE_ARGUMENT_NESTING_DEPTH_LIMIT_EXCEEDED, problem.getID()); } + + // template + // struct infinite; + // + // template + // struct infinite_generator { + // typedef infinite::type> type; + // }; + // + // template + // struct infinite_generator { + // typedef Infinite type; + // }; + // + // template + // struct infinite { + // typedef infinite self_type; + // + // template + // static typename infinite_generator::type generate() { + // return typename infinite_generator::type(); + // } + // }; + // + // auto parser_killer_2 = infinite::generate<400>(); + public void testTemplateInstantiationDepthLimit_512297() throws Exception { + CPPASTNameBase.sAllowRecursionBindings = true; + BindingAssertionHelper helper = getAssertionHelper(); + helper.assertProblem("generate<400>", "generate<400>"); + } } 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 932947ae937..fae6938ac21 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 @@ -227,7 +227,7 @@ public class CPPTemplates { static enum TypeSelection { PARAMETERS, RETURN_TYPE, PARAMETERS_AND_RETURN_TYPE } // Infrastructure to protect against rogue template metaprograms that don't terminate. - private static final int TEMPLATE_INSTANTIATION_DEPTH_LIMIT = 256; + private static final int TEMPLATE_INSTANTIATION_DEPTH_LIMIT = 128; private static final ThreadLocal fTemplateInstantiationDepth = new ThreadLocal() { @Override protected Integer initialValue() {