From 72d90351736e74f0e2860fc10e3b6bcc67a5fbce Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 5 Apr 2018 03:05:56 -0400 Subject: [PATCH] Bug 533216 - Correctly classify local types as dependent or not Change-Id: Ie34d0540fd1efa85e29dbe525b75a35af21dc7cf --- .../tests/IndexCPPTemplateResolutionTest.java | 21 +++++++++++++++++++ .../parser/cpp/semantics/CPPTemplates.java | 6 ++++++ 2 files changed, 27 insertions(+) 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);