From e25410c174aed989898623fdb7648ed35de76b30 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 4 Mar 2009 10:34:17 +0000 Subject: [PATCH] Name resolution problem with friend class template, bug 266992. --- .../core/parser/tests/ast2/AST2TemplateTests.java | 14 ++++++++++++++ .../cdt/internal/core/dom/parser/cpp/CPPScope.java | 12 +++++++++--- 2 files changed, 23 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 53105c6902a..aae8193e61f 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 @@ -3954,4 +3954,18 @@ public class AST2TemplateTests extends AST2BaseTest { final String code = getAboveComment(); parseAndCheckBindings(code, ParserLanguage.CPP); } + + // template class X {}; + // template class X1 { + // friend class X; + // }; + // template class Y : X1 { + // void test() { + // X x; // problem binding on X + // } + // }; + public void testFriendClassTemplate_266992() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java index f8aa2aac48e..16c4852f7de 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; @@ -279,10 +280,15 @@ abstract public class CPPScope implements ICPPScope, ICPPASTInternalScope { IBinding binding; if (candidate instanceof IASTName) { final IASTName candName= (IASTName) candidate; - if (forceResolve && candName != name && candName != name.getParent()) { - binding = candName.resolvePreBinding(); + IASTName simpleName= candName.getLastName(); + if (simpleName instanceof ICPPASTTemplateId) { + simpleName= ((ICPPASTTemplateId) simpleName).getTemplateName(); + } + if (forceResolve && candName != name && simpleName != name) { + candName.resolvePreBinding(); // make sure to resolve the template-id + binding = simpleName.resolvePreBinding(); } else { - binding = candName.getLastName().getBinding(); + binding = simpleName.getPreBinding(); } } else { binding= (IBinding) candidate;