Bug 533216 - Correctly classify local types as dependent or not

Change-Id: Ie34d0540fd1efa85e29dbe525b75a35af21dc7cf
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 c5c65d3..5fedc93 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 void testConstexprInitListConstructor_519091() throws Exception {
 		checkBindings();
 	}
+	
+	//	template <typename T> T&& declval();
+	//	  
+	//	template <typename Value, typename Func, 
+	//	          typename Requires = decltype(declval<Func>()(declval<Value>()))>
+	//	void apply(Value, Func);
+	//
+	//	template <typename T>
+	//	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 845a325..98574a7 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 @@
 				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);