From 5babeafa311739596cb3dbed19774b7cc45e46e7 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 24 Jan 2017 00:47:57 -0500 Subject: [PATCH] Bug 510834 - Propagate substitute failure in EvalID.instantiate() with field owner Change-Id: I27088b7da18f7fe52d77bd669e32b225a1e99d21 --- .../parser/tests/ast2/AST2TemplateTests.java | 35 +++++++++++++++++++ .../core/dom/parser/cpp/semantics/EvalID.java | 2 ++ 2 files changed, 37 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 e58afe96b7f..e25d2a2728c 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 @@ -10018,4 +10018,39 @@ public class AST2TemplateTests extends AST2TestBase { // Just check that resolution does not throw an exception. helper.findName("waldo").resolveBinding(); } + + // template + // struct has_rbegin_impl { + // typedef char yes[1]; + // typedef char no[2]; + // template + // static yes& test(Inner *I, decltype(I->rbegin()) * = nullptr); + // template + // static no& test(...); + // static const bool value = sizeof(test(nullptr)) == sizeof(yes); + // }; + // + // template + // struct enable_if {}; + // + // template + // struct enable_if { + // typedef _Tp type; + // }; + // + // template + // void reverse(Container&& C, typename enable_if::value>::type * = nullptr); + // + // template + // void reverse(Container&& C, typename enable_if::value>::type * = nullptr); + // + // class MyContainer{}; + // + // int main() { + // MyContainer c; + // reverse(c); // Ambiguous + // } + public void testWaldo_510834() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java index 61d66faa032..fcba09d2a6a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java @@ -393,6 +393,8 @@ public class EvalID extends CPPDependentEvaluation { ICPPEvaluation eval = resolveName((ICPPClassType) fieldOwnerClassType, fieldOwner, templateArgs, fieldOwnerClassTypeCV, context.getPoint()); if (eval != null) return eval; + if (!CPPTemplates.isDependentType(fieldOwnerClassType)) + return EvalFixed.INCOMPLETE; } }