diff options
2 files changed, 43 insertions, 3 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 28174ce7a70..b07c15764e2 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 @@ -9916,7 +9916,43 @@ public class AST2TemplateTests extends AST2TestBase { // MyContainer c; // reverse(c); // Ambiguous // } - public void testWaldo_510834() throws Exception { + public void testSFINAEInEvalIdWithFieldOwner_510834() throws Exception { + parseAndCheckBindings(); + } + + // template <typename, typename> + // struct is_same { + // static constexpr bool value = false; + // }; + // + // template <typename T> + // struct is_same<T, T> { + // static constexpr bool value = true; + // }; + // + // template <bool C, typename> + // struct enable_if {}; + // + // template <typename R> + // struct enable_if<true, R> { + // typedef R type; + // }; + // + // template <typename, typename> + // struct arg {}; + // + // template <typename> + // struct param { + // template<typename I> + // param(arg<I, typename enable_if<is_same<I, int>::value, int>::type>&) {} + // }; + // + // void foo(param<int>); + // + // void bar(arg<int, int>& x) { + // foo(x); + // } + public void testInstantiationOfEvalIdWithFieldOwner_511108() 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 7b8620ee927..36c5bf82747 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 @@ -370,15 +370,19 @@ public class EvalID extends CPPDependentEvaluation { if (templateArgs == fTemplateArgs && fieldOwner == fFieldOwner && nameOwner == fNameOwner) return this; + boolean nameOwnerStillDependent = false; if (nameOwner instanceof ICPPClassType) { ICPPEvaluation eval = resolveName((ICPPClassType) nameOwner, null, templateArgs, null, context.getPoint()); if (eval != null) return eval; - if (!CPPTemplates.isDependentType((ICPPClassType) nameOwner)) + if (CPPTemplates.isDependentType((ICPPClassType) nameOwner)) { + nameOwnerStillDependent = true; + } else { return EvalFixed.INCOMPLETE; + } } - if (fieldOwner != null && !fieldOwner.isTypeDependent()) { + if (!nameOwnerStillDependent && fieldOwner != null && !fieldOwner.isTypeDependent()) { IType fieldOwnerType = fieldOwner.getType(context.getPoint()); if (fIsPointerDeref) { fieldOwnerType = SemanticUtil.getSimplifiedType(fieldOwnerType); |