diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index dd277c664dc..70cda103998 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -1676,7 +1676,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // vector v; // f(v.begin()); // } - public void _testTemplateMetaprogramming_284686() throws Exception { + public void testTemplateMetaprogramming_284686() throws Exception { getBindingFromASTName("f(v.begin())", 1, ICPPFunction.class); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java index c049efc3c72..16292213811 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java @@ -61,4 +61,5 @@ public interface IIndexCPPBindingConstants { int CPP_FRIEND_DECLARATION = IIndexBindingConstants.LAST_CONSTANT + 45; int CPP_TEMPLATE_TEMPLATE_PARAMETER= IIndexBindingConstants.LAST_CONSTANT + 46; int CPP_CLASS_TEMPLATE_PARTIAL_SPEC_SPEC = IIndexBindingConstants.LAST_CONSTANT + 47; + int CPP_UNKNOWN_BINDING = IIndexBindingConstants.LAST_CONSTANT + 48; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 14e66009dd8..8d7941d8679 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -182,10 +182,11 @@ public class PDOM extends PlatformObject implements IPDOM { * * CDT 7.0 development (versions not supported on the 6.0.x branch) * 90.0 - support for array sizes, bug 269926 + * 91.0 - storing unknown bindings other than unknown class types, bug 284686. */ - private static final int MIN_SUPPORTED_VERSION= version(90, 0); - private static final int MAX_SUPPORTED_VERSION= version(90, Short.MAX_VALUE); - private static final int DEFAULT_VERSION = version(90, 0); + private static final int MIN_SUPPORTED_VERSION= version(91, 0); + private static final int MAX_SUPPORTED_VERSION= version(91, Short.MAX_VALUE); + private static final int DEFAULT_VERSION = version(91, 0); private static int version(int major, int minor) { return (major << 16) + minor; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index 31046feb2fa..8f8245f72a1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -175,8 +175,14 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage return null; } - public PDOMNode getNode(long record) throws CoreException { - switch (PDOMNode.getNodeType(fDatabase, record)) { + public final PDOMNode getNode(long record) throws CoreException { + if (record == 0) { + return null; + } + final int nodeType= PDOMNode.getNodeType(fDatabase, record); + switch (nodeType) { + case LINKAGE: + return null; case POINTER_TYPE: return new PDOMPointerType(this, record); case ARRAY_TYPE: @@ -184,9 +190,11 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage case QUALIFIER_TYPE: return new PDOMQualifierType(this, record); } - return null; + return getNode(record, nodeType); } + abstract public PDOMNode getNode(long record, int nodeType) throws CoreException; + public PDOMNode addType(PDOMNode parent, IType type) throws CoreException { if (type instanceof IPointerType) return new PDOMPointerType(this, parent, (IPointerType)type); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java index 62415d0358b..4810f34bbb2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java @@ -17,7 +17,6 @@ package org.eclipse.cdt.internal.core.pdom.dom; import java.util.Arrays; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.pdom.db.Database; @@ -123,7 +122,7 @@ public abstract class PDOMNamedNode extends PDOMNode { public IIndexFragmentBinding getParentBinding() throws CoreException { PDOMNode parent= getParentNode(); - if (parent instanceof IIndexBinding) { + if (parent instanceof IIndexFragmentBinding) { return (IIndexFragmentBinding) parent; } return null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java index 20146951192..c19acd503c6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java @@ -296,11 +296,8 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { } @Override - public PDOMNode getNode(long record) throws CoreException { - if (record == 0) - return null; - - switch (PDOMNode.getNodeType(getDB(), record)) { + public PDOMNode getNode(long record, int nodeType) throws CoreException { + switch (nodeType) { case CVARIABLE: return new PDOMCVariable(this, record); case CFUNCTION: @@ -323,7 +320,8 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { return new PDOMCFunctionType(this, record); } - return super.getNode(record); + assert false; + return null; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java index 23a3780a20a..d6042ad524d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java @@ -76,18 +76,17 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP Database db = getDB(); try { + IParameter[] params= function.getParameters(); + IType[] paramTypes= IType.EMPTY_TYPE_ARRAY; IFunctionType ft= function.getType(); if (ft != null) { PDOMNode typeNode = getLinkage().addType(this, ft); if (typeNode != null) { db.putRecPtr(record + FUNCTION_TYPE, typeNode.getRecord()); + paramTypes= ((IFunctionType) typeNode).getParameterTypes(); } } - ft= getType(); - IParameter[] params= function.getParameters(); - IType[] paramTypes= ft.getParameterTypes(); - ICPPFunction sFunc= (ICPPFunction) ((ICPPSpecialization)function).getSpecializedBinding(); IParameter[] sParams= sFunc.getParameters(); IType[] sParamTypes= sFunc.getType().getParameterTypes(); @@ -95,11 +94,13 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP final int length= Math.min(sParams.length, params.length); db.putInt(record + NUM_PARAMS, length); for (int i=0; i