diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index c5c65d39bfa..5fedc936e13 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -3198,4 +3198,25 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa public void testConstexprInitListConstructor_519091() throws Exception { checkBindings(); } + + // template T&& declval(); + // + // template ()(declval()))> + // void apply(Value, Func); + // + // template + // void callInTemplateContext(int i) { + // return apply(i, [](int x) { return T(x); }); + // } + // + // void consume(int); + // void callInCpp1(int i); + + // void callInCpp1(int i) { + // apply(i, &consume); + // } + public void testClassCastException_533216() throws Exception { + checkBindings(); + } } 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 845a3256fdb..98574a76890 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 @@ -2973,6 +2973,12 @@ public class CPPTemplates { return ((InitializerListType) t).getEvaluation().isTypeDependent(); } else if (t instanceof IBinding) { IBinding owner = ((IBinding) t).getOwner(); + if (owner instanceof IFunction) { + if (owner instanceof ICPPFunctionTemplate) { + return true; + } + owner = owner.getOwner(); + } if (owner instanceof ICPPClassTemplate) return true; return (owner instanceof IType) && owner != t && isDependentType((IType) owner);