From 14627a10868652e580996deca5bb1cae59730964 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 8 Nov 2012 20:04:06 -0800 Subject: [PATCH] Fixed a regression in name resolution. --- .../parser/tests/ast2/AST2TemplateTests.java | 43 +++++++++++++------ .../parser/cpp/CPPTemplateTypeArgument.java | 3 +- .../parser/cpp/semantics/CPPTemplates.java | 10 ++--- .../parser/cpp/semantics/SemanticUtil.java | 2 +- 4 files changed, 38 insertions(+), 20 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 9ff2bcef0c5..36398f1d018 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 @@ -3704,6 +3704,25 @@ public class AST2TemplateTests extends AST2BaseTest { bh.assertNonProblem("func(p)", 4, ICPPFunction.class); } + // template + // struct C { + // typedef void (T::*PMF)(); + // C(PMF member); + // }; + // + // struct A { + // void m(); + // }; + // + // typedef A B; + // + // void test() { + // new C(&B::m); + // } + public void testTypedef() throws Exception { + parseAndCheckBindings(); + } + // template // struct basic_string { // basic_string& operator+=(const T* s); @@ -3759,34 +3778,34 @@ public class AST2TemplateTests extends AST2BaseTest { // // template // struct iterator_traits { - // typedef typename _Iterator::reference reference; + // typedef typename _Iterator::reference reference; // }; // // template // struct iterator_traits<_Tp*> { - // typedef _Tp& reference; + // typedef _Tp& reference; // }; // // template // struct normal_iterator { - // typedef iterator_traits<_Iterator> traits_type; - // typedef typename traits_type::reference reference; - // reference operator*() const; + // typedef iterator_traits<_Iterator> traits_type; + // typedef typename traits_type::reference reference; + // reference operator*() const; // }; // // template struct vector { - // typedef T* pointer; - // typedef normal_iterator iterator; - // iterator begin(); - // iterator end(); + // typedef T* pointer; + // typedef normal_iterator iterator; + // iterator begin(); + // iterator end(); // }; // // typedef basic_string string; // // void test() { - // vector v; - // for (auto s : v) { - // } + // vector v; + // for (auto s : v) { + // } // } public void testTypedefPreservation_380498_3() throws Exception { BindingAssertionHelper ba= getAssertionHelper(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java index 8f619a4e91b..b7ad7ff7c0d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameterPackType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.core.runtime.Assert; /** @@ -25,7 +26,7 @@ public class CPPTemplateTypeArgument implements ICPPTemplateArgument { private final IType fOriginalType; public CPPTemplateTypeArgument(IType type) { - this(type, type); + this(SemanticUtil.getSimplifiedType(type), type); } public CPPTemplateTypeArgument(IType simplifiedType, IType originalType) { 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 bbb9dba7141..276c7903673 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 @@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getNestedType; @@ -44,7 +45,6 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IProblemBinding; -import org.eclipse.cdt.core.dom.ast.IQualifierType; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.ISemanticProblem; import org.eclipse.cdt.core.dom.ast.IType; @@ -1202,11 +1202,9 @@ public class CPPTemplates { ICPPPointerToMemberType ptm = (ICPPPointerToMemberType) typeContainer; IType memberOfClass = ptm.getMemberOfClass(); IType newMemberOfClass = instantiateType(memberOfClass, tpMap, packOffset, within, point); - if (newMemberOfClass instanceof IQualifierType) { - newMemberOfClass = ((IQualifierType) newMemberOfClass).getType(); - } - if (!(newMemberOfClass instanceof ICPPClassType || newMemberOfClass instanceof UniqueType - || newMemberOfClass instanceof ICPPUnknownBinding)) { + IType classType = SemanticUtil.getNestedType(newMemberOfClass, CVTYPE | TDEF); + if (!(classType instanceof ICPPClassType || classType instanceof UniqueType + || classType instanceof ICPPUnknownBinding)) { return new ProblemType(ISemanticProblem.BINDING_INVALID_TYPE); } if (newNestedType != nestedType || newMemberOfClass != memberOfClass) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java index 6921ea4348d..5431c752d7c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java @@ -318,7 +318,7 @@ public class SemanticUtil { /** * Simplifies type by resolving typedefs within the given type. */ - static IType getSimplifiedType(IType type) { + public static IType getSimplifiedType(IType type) { if (type instanceof ICPPFunctionType) { final ICPPFunctionType ft = (ICPPFunctionType) type; IType ret = null;