From 78c15867f9c0aec075b044bd61f292bb903056ee Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 10 Jun 2016 17:45:53 -0700 Subject: [PATCH] Bug 495845 - Name resolution problem with SFINAE and trailing return type Change-Id: Ib3dff25c9e8c85b95a0e9cd1a7296fd9756b1511 --- .../core/parser/tests/ast2/AST2TemplateTests.java | 13 +++++++++++++ .../dom/parser/cpp/semantics/EvalFunctionSet.java | 3 +++ 2 files changed, 16 insertions(+) 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 054e3641ce3..e528729f54a 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 @@ -7805,6 +7805,19 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // auto waldo(T p) -> decltype(undeclared(p)); + // + // template + // void waldo(T p); + // + // void test() { + // waldo(1); + // } + public void testSfinaeInTrailingReturnType_495845() throws Exception { + parseAndCheckBindings(); + } + // template // struct M { // template diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionSet.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionSet.java index bbfc0dac549..66ca2620625 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionSet.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionSet.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; @@ -330,6 +331,8 @@ public class EvalFunctionSet extends CPPDependentEvaluation { // Perform template instantiation and overload resolution. IBinding binding = CPPSemantics.resolveFunction(data, functions, true); + if (binding == null || binding instanceof IProblemBinding) + return EvalFixed.INCOMPLETE; if (binding instanceof ICPPFunction && !(binding instanceof ICPPUnknownBinding)) return new EvalBinding(binding, null, getTemplateDefinition()); } catch (DOMException e) {