diff options
author | Nathan Ridge | 2017-01-24 05:47:57 +0000 |
---|---|---|
committer | Nathan Ridge | 2017-02-09 20:02:52 +0000 |
commit | 0eb29c397df19ed6894031cb9f472cbecd67107e (patch) | |
tree | 15b9bdbfcb2a94d96c45f430ecbc5762dfc8e92f | |
parent | 810257caee3494f596600cd3ebf869d874b5f0c5 (diff) | |
download | org.eclipse.cdt-0eb29c397df19ed6894031cb9f472cbecd67107e.tar.gz org.eclipse.cdt-0eb29c397df19ed6894031cb9f472cbecd67107e.tar.xz org.eclipse.cdt-0eb29c397df19ed6894031cb9f472cbecd67107e.zip |
Bug 510834 - Propagate substitute failure in EvalID.instantiate() with field owner
Change-Id: I27088b7da18f7fe52d77bd669e32b225a1e99d21
2 files changed, 37 insertions, 0 deletions
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 7a4a3518a32..28174ce7a70 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 @@ -9884,4 +9884,39 @@ public class AST2TemplateTests extends AST2TestBase { // Just check that resolution does not throw an exception. helper.findName("waldo", 5).resolveBinding(); } + + // template <typename Ty> + // struct has_rbegin_impl { + // typedef char yes[1]; + // typedef char no[2]; + // template <typename Inner> + // static yes& test(Inner *I, decltype(I->rbegin()) * = nullptr); + // template <typename > + // static no& test(...); + // static const bool value = sizeof(test<Ty>(nullptr)) == sizeof(yes); + // }; + // + // template <bool, typename _Tp = void> + // struct enable_if {}; + // + // template <typename _Tp> + // struct enable_if<true, _Tp> { + // typedef _Tp type; + // }; + // + // template <typename Container> + // void reverse(Container&& C, typename enable_if<has_rbegin_impl<Container>::value>::type * = nullptr); + // + // template <typename Container> + // void reverse(Container&& C, typename enable_if<!has_rbegin_impl<Container>::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 9827261bbe2..7b8620ee927 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 @@ -394,6 +394,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; } } |