diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java index ad83a0ec84b..8d2936d361c 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBugsTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2008 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2009 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; @@ -1622,4 +1623,32 @@ public class IndexBugsTests extends BaseTestCase { fIndex.releaseReadLock(); } } + + // namespace ns { + // template class X {}; + // } + // class Y : public ns::X { + // }; + public void testInstanceInheritance_258745() throws Exception { + String code= getContentsForTest(1)[0]; + final IIndexManager indexManager = CCorePlugin.getIndexManager(); + IFile file= TestSourceReader.createFile(fCProject.getProject(), "test.cpp", code); + waitUntilFileIsIndexed(file, 4000); + fIndex.acquireReadLock(); + try { + IIndexBinding[] bindings = fIndex.findBindings("Y".toCharArray(), false, IndexFilter.ALL_DECLARED, NPM); + assertEquals(1, bindings.length); + ICPPClassType ct= (ICPPClassType) bindings[0]; + final ICPPBase[] bases = ct.getBases(); + assertEquals(1, bases.length); + IBinding inst = bases[0].getBaseClass(); + assertTrue(inst instanceof ICPPTemplateInstance); + + IIndexName name= (IIndexName) bases[0].getBaseClassSpecifierName(); + IBinding inst2= fIndex.findBinding(name); + assertEquals(inst, inst2); + } finally { + fIndex.releaseReadLock(); + } + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java index 7298c6be8ae..03454069705 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2009 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.ITypedef; +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.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; @@ -388,14 +389,17 @@ abstract public class PDOMWriter { protected final boolean isRequiredReference(IASTName name) { IASTNode parentNode= name.getParent(); + if (parentNode instanceof ICPPASTQualifiedName) { + if (name != ((ICPPASTQualifiedName) parentNode).getLastName()) + return false; + parentNode= parentNode.getParent(); + } if (parentNode instanceof ICPPASTBaseSpecifier) { return true; - } - else if (parentNode instanceof IASTDeclSpecifier) { + } else if (parentNode instanceof IASTDeclSpecifier) { IASTDeclSpecifier ds= (IASTDeclSpecifier) parentNode; return ds.getStorageClass() == IASTDeclSpecifier.sc_typedef; - } - else if (parentNode instanceof ICPPASTUsingDirective) { + } else if (parentNode instanceof ICPPASTUsingDirective) { return true; } return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 3d66440ac05..7311e8afdc6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2008 QNX Software Systems and others. + * Copyright (c) 2005, 2009 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -36,7 +36,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; 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.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -830,16 +829,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { super.onCreateName(file, name, pdomName); IASTNode parentNode= name.getParent(); - IASTNode nameNode = name; - if (name.getPropertyInParent() == ICPPASTTemplateId.TEMPLATE_NAME && - parentNode.getParent() instanceof ICPPASTQualifiedName) { - nameNode = parentNode; - parentNode = parentNode.getParent(); - } if (parentNode instanceof ICPPASTQualifiedName) { - if (nameNode != ((ICPPASTQualifiedName) parentNode).getLastName()) { - return; - } + if (name != ((ICPPASTQualifiedName) parentNode).getLastName()) + return; parentNode = parentNode.getParent(); } if (parentNode instanceof ICPPASTBaseSpecifier) { @@ -861,8 +853,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { pdomName.setIsBaseSpecifier(true); } } - } - else if (parentNode instanceof ICPPASTUsingDirective) { + } else if (parentNode instanceof ICPPASTUsingDirective) { IScope container= CPPVisitor.getContainingScope(name); try { boolean doit= false; @@ -892,8 +883,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } catch (DOMException e) { CCorePlugin.log(e); } - } - else if (parentNode instanceof ICPPASTElaboratedTypeSpecifier) { + } else if (parentNode instanceof ICPPASTElaboratedTypeSpecifier) { ICPPASTElaboratedTypeSpecifier elaboratedSpecifier = (ICPPASTElaboratedTypeSpecifier)parentNode; if (elaboratedSpecifier.isFriend()) { pdomName.setIsFriendSpecifier(true); @@ -903,8 +893,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { ((PDOMCPPClassType)enclClassBinding).addFriend(new PDOMCPPFriend(pdom, pdomName)); } } - } - else if (parentNode instanceof ICPPASTFunctionDeclarator) { + } else if (parentNode instanceof ICPPASTFunctionDeclarator) { if (parentNode.getParent() instanceof IASTSimpleDeclaration) { IASTSimpleDeclaration grandparentNode = (IASTSimpleDeclaration) parentNode.getParent(); if (grandparentNode.getDeclSpecifier() instanceof ICPPASTDeclSpecifier) {