1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Class instance as base class, bug 258745.

This commit is contained in:
Markus Schorn 2009-01-27 16:26:49 +00:00
parent 48ad5e5042
commit 0ce1436bdc
3 changed files with 45 additions and 23 deletions

View file

@ -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<typename T> class X {};
// }
// class Y : public ns::X<int> {
// };
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();
}
}
}

View file

@ -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;

View file

@ -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) {