1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 359376: Updating implicit ctors in index.

This commit is contained in:
Markus Schorn 2011-09-30 14:13:18 +02:00
parent 19175c1f09
commit 7affbb771e
3 changed files with 52 additions and 2 deletions

View file

@ -1432,5 +1432,36 @@ public class IndexUpdateTests extends IndexTestBase {
fIndex.releaseReadLock();
}
}
// struct S {};
// struct S {S(int){}};
public void testImplicitDefaultCtor_Bug359376() throws Exception {
setupFile(2, true);
fIndex.acquireReadLock();
try {
final ICPPClassType s = (ICPPClassType) findBinding("S");
assertNotNull(s);
final ICPPConstructor[] ctors = s.getConstructors();
assertEquals(2, ctors.length); // 2 implicit ctors
assertTrue(ctors[0].isImplicit());
assertTrue(ctors[1].isImplicit());
} finally {
fIndex.releaseReadLock();
}
updateFile();
fIndex.acquireReadLock();
try {
final ICPPClassType s = (ICPPClassType) findBinding("S");
assertNotNull(s);
final ICPPConstructor[] ctors = s.getConstructors();
assertEquals(2, ctors.length); // 1 explicit and one implicit ctor
assertTrue(ctors[0].isImplicit() != ctors[1].isImplicit());
} finally {
fIndex.releaseReadLock();
}
}
}

View file

@ -13,6 +13,8 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
@ -473,6 +475,13 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
final long fileLocalRec= type.getLocalToFileRec();
IScope scope = binding.getCompositeScope();
if (scope instanceof ICPPClassScope) {
List<ICPPMethod> old= new ArrayList<ICPPMethod>();
if (type instanceof ICPPClassType) {
IScope oldScope = ((ICPPClassType)type).getCompositeScope();
if (oldScope instanceof ICPPClassScope) {
old.addAll(Arrays.asList(((ICPPClassScope) oldScope).getImplicitMethods()));
}
}
ICPPMethod[] implicit= ((ICPPClassScope) scope).getImplicitMethods();
for (ICPPMethod method : implicit) {
if (!(method instanceof IProblemBinding)) {
@ -481,9 +490,14 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
pdomBinding = createBinding(type, method, fileLocalRec);
} else if (!getPDOM().hasLastingDefinition(pdomBinding)) {
pdomBinding.update(this, method);
old.remove(pdomBinding);
}
}
}
for (ICPPMethod method : old) {
if (method instanceof PDOMBinding)
((PDOMBinding) method).update(this, null);
}
}
} catch (DOMException e) {
CCorePlugin.log(e);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006, 2010 QNX Software Systems and others.
* Copyright (c) 2006, 2011 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
@ -80,7 +80,7 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod {
}
@Override
public void update(final PDOMLinkage linkage, IBinding newBinding) throws CoreException {
public final void update(final PDOMLinkage linkage, IBinding newBinding) throws CoreException {
if (newBinding instanceof ICPPMethod) {
ICPPMethod method= (ICPPMethod) newBinding;
super.update(linkage, newBinding);
@ -92,6 +92,11 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod {
} catch (DOMException e) {
throw new CoreException(Util.createStatus(e));
}
} else if (newBinding == null && isImplicit()) {
// Clear the implicit flag, such that the binding will no longer be picked up.
byte annot= (byte) (getAnnotation1() ^ (1 << PDOMCPPAnnotation.IMPLICIT_METHOD_OFFSET));
getDB().putByte(record + ANNOTATION1, annot);
annotation1= annot;
}
}