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

Revert "Bug 408314 - Failure of dependent base lookup"

This reverts commit 96e51dfbca.
This commit is contained in:
Sergey Prigogin 2013-05-21 10:55:24 -07:00
parent 96e51dfbca
commit 99767b4630
12 changed files with 110 additions and 105 deletions

View file

@ -13,7 +13,6 @@
* Sergey Prigogin (Google)
* Thomas Corbat (IFS)
* Nathan Ridge
* Danny Ferreira
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
@ -1969,8 +1968,7 @@ public class AST2TemplateTests extends AST2TestBase {
ITypedef myType = (ITypedef) col.getName(31).resolveBinding();
ICPPClassType A = (ICPPClassType) myType.getType();
ICPPClassTemplatePartialSpecialization Aspec =
(ICPPClassTemplatePartialSpecialization) col.getName(10).resolveBinding();
ICPPSpecialization Aspec = (ICPPSpecialization) col.getName(10).resolveBinding();
assertTrue(A instanceof ICPPTemplateInstance);
assertSame(((ICPPTemplateInstance)A).getTemplateDefinition(), Aspec);
@ -3226,67 +3224,7 @@ public class AST2TemplateTests extends AST2TestBase {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), CPP);
ba.assertNonProblem("foo(s", 3);
}
// template<typename U>
// struct result : U {
// typedef typename result::result_type type;
// };
//
// struct B {
// typedef int result_type;
// };
//
// typedef result<B>::type waldo;
public void testDependentBaseLookup_408314a() throws Exception {
BindingAssertionHelper bh = getAssertionHelper();
ITypedef waldo = bh.assertNonProblem("waldo");
assertSameType(waldo.getType(), CommonTypes.int_);
}
// template <typename T>
// struct A {
// template <typename U>
// struct result;
//
// template <typename V>
// struct result<V*> : T {
// typedef typename result::result_type type;
// };
// };
//
// struct B {
// typedef int result_type;
// };
//
// typedef A<B>::result<int*>::type waldo;
public void testDependentBaseLookup_408314b() throws Exception {
BindingAssertionHelper bh = getAssertionHelper();
ITypedef waldo = bh.assertNonProblem("waldo");
assertSameType(waldo.getType(), CommonTypes.int_);
}
// template <typename T>
// struct A {
// template <typename U>
// struct result;
//
// template <typename V>
// struct result<V*> : T {
// typedef typename result::result_type type;
// };
// };
//
// struct B {
// typedef int result_type;
// };
//
// typedef A<B>::result<B*>::type waldo;
public void testDependentBaseLookup_408314c() throws Exception {
BindingAssertionHelper bh = getAssertionHelper();
ITypedef waldo = bh.assertNonProblem("waldo");
assertSameType(waldo.getType(), CommonTypes.int_);
}
// template <class T>
// class A {
// public:

View file

@ -599,14 +599,17 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
IBinding b3= getBindingFromASTName("D<B", 1);
List spBindings= new ArrayList();
assertInstance(b0, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization)b0).getPrimaryClassTemplate());
assertInstance(b0, ICPPSpecialization.class);
assertInstance(b0, ICPPClassTemplate.class);
spBindings.add(((ICPPSpecialization)b0).getSpecializedBinding());
assertInstance(b1, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization)b1).getPrimaryClassTemplate());
assertInstance(b1, ICPPSpecialization.class);
assertInstance(b1, ICPPClassTemplate.class);
spBindings.add(((ICPPSpecialization)b1).getSpecializedBinding());
assertInstance(b2, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization)b2).getPrimaryClassTemplate());
assertInstance(b2, ICPPSpecialization.class);
assertInstance(b2, ICPPClassTemplate.class);
spBindings.add(((ICPPSpecialization)b2).getSpecializedBinding());
for(int i=0; i<spBindings.size(); i++) {
for(int j=0; j<spBindings.size(); j++) {

View file

@ -13,21 +13,25 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
/**
* A partial class template specialization.
*/
public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate
implements ICPPClassTemplatePartialSpecialization {
implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization {
private final ICPPTemplateArgument[] arguments;
@ -50,11 +54,27 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate
return (ICPPClassTemplate) id.getTemplateName().resolveBinding();
}
@Override
public IBinding getSpecializedBinding() {
return getPrimaryClassTemplate();
}
@Override
public ICPPTemplateParameterMap getTemplateParameterMap() {
return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments());
}
@Override
public String toString() {
return super.toString() + ASTTypeUtil.getArgumentListString(getTemplateArguments(), true);
}
@Override
@Deprecated
public ObjectMap getArgumentMap() {
return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap());
}
@Override
@Deprecated
public IType[] getArguments() throws DOMException {

View file

@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
@ -48,9 +47,8 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding();
ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations();
ICPPClassTemplatePartialSpecialization[] spec = new ICPPClassTemplatePartialSpecialization[orig.length];
ICPPClassSpecialization owner = (ICPPClassSpecialization) getOwner();
for (int i = 0; i < orig.length; i++) {
spec[i]= (ICPPClassTemplatePartialSpecialization) owner.specializeMember(orig[i], point);
spec[i]= (ICPPClassTemplatePartialSpecialization) specializeMember(orig[i], point);
}
fPartialSpecs = spec;
}

View file

@ -14,12 +14,10 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.internal.core.dom.parser.ISerializableType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPUnknownField;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPUnknownMemberClass;
@ -34,9 +32,6 @@ public class CPPUnknownMember extends CPPUnknownBinding implements ICPPUnknownMe
protected CPPUnknownMember(IType owner, char[] name) {
super(name);
if (owner instanceof ICPPClassTemplate) {
owner= CPPTemplates.createDeferredInstance((ICPPClassTemplate) owner);
}
fOwner= owner;
}

View file

@ -2638,7 +2638,15 @@ public class CPPTemplates {
}
if (changed) {
IBinding inst= instantiate(classTemplate, newArgs, point);
IBinding inst= null;
if (classTemplate instanceof ICPPClassTemplatePartialSpecialization) {
try {
inst= instantiatePartialSpecialization((ICPPClassTemplatePartialSpecialization) classTemplate, newArgs, false, null, point);
} catch (DOMException e) {
}
} else {
inst= instantiate(classTemplate, newArgs, point);
}
if (inst != null)
return inst;
}

View file

@ -518,7 +518,9 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
}
} else if (binding instanceof ICPPTemplateDefinition) {
if (binding instanceof ICPPClassTemplatePartialSpecialization) {
return new CompositeCPPClassTemplatePartialSpecializationSpecialization(this, (ICPPClassTemplatePartialSpecializationSpecialization) binding);
if (binding instanceof ICPPClassTemplatePartialSpecializationSpecialization)
return new CompositeCPPClassTemplatePartialSpecializationSpecialization(this, (ICPPClassTemplatePartialSpecializationSpecialization) binding);
return new CompositeCPPClassTemplatePartialSpecialization(this, (ICPPClassTemplatePartialSpecialization) findOneBinding(binding));
} else if (binding instanceof ICPPClassType) {
return new CompositeCPPClassTemplateSpecialization(this, (ICPPClassType) binding);
} else if (binding instanceof ICPPConstructor) {
@ -555,8 +557,6 @@ public class CPPCompositesFactory extends AbstractCompositeFactory {
throw new CompositingNotImplementedError("Composite binding unavailable for " + binding + " " + binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$
}
}
} else if (binding instanceof ICPPClassTemplatePartialSpecialization) {
return new CompositeCPPClassTemplatePartialSpecialization(this, (ICPPClassTemplatePartialSpecialization) findOneBinding(binding));
} else if (binding instanceof ICPPTemplateParameter) {
if (binding instanceof ICPPTemplateTypeParameter) {
result = new CompositeCPPTemplateTypeParameter(this, (ICPPTemplateTypeParameter) binding);

View file

@ -11,16 +11,21 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader;
import org.eclipse.core.runtime.CoreException;
public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, IPDOMOverloader {
public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader {
public CompositeCPPClassTemplatePartialSpecialization(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization delegate) {
super(cf, delegate);
}
@ -31,16 +36,36 @@ public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPP
return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding)preresult);
}
@Override
public IBinding getSpecializedBinding() {
return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding);
}
@Override
public int getSignatureHash() throws CoreException {
return ((IPDOMOverloader) rbinding).getSignatureHash();
}
@Override
public ICPPTemplateParameterMap getTemplateParameterMap() {
IBinding owner= getOwner();
if (owner instanceof ICPPSpecialization) {
return ((ICPPSpecialization) owner).getTemplateParameterMap();
}
return CPPTemplateParameterMap.EMPTY;
}
@Override
public ICPPTemplateArgument[] getTemplateArguments() {
return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPClassTemplatePartialSpecialization) rbinding);
}
@Override
@Deprecated
public ObjectMap getArgumentMap() {
return TemplateInstanceUtil.getArgumentMap(cf, rbinding);
}
@Override
@Deprecated
public IType[] getArguments() {

View file

@ -13,11 +13,16 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -34,7 +39,7 @@ import org.eclipse.core.runtime.CoreException;
* Partial specialization of a class template for the index.
*/
class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate
implements IPDOMPartialSpecialization, IPDOMOverloader {
implements IPDOMPartialSpecialization, ICPPSpecialization, IPDOMOverloader {
private static final int ARGUMENTS = PDOMCPPClassTemplate.RECORD_SIZE + 0;
private static final int SIGNATURE_HASH = PDOMCPPClassTemplate.RECORD_SIZE + 4;
private static final int PRIMARY = PDOMCPPClassTemplate.RECORD_SIZE + 8;
@ -102,6 +107,11 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate
}
}
@Override
public IBinding getSpecializedBinding() {
return getPrimaryClassTemplate();
}
@Override
public void setArguments(ICPPTemplateArgument[] templateArguments) throws CoreException {
final Database db = getPDOM().getDB();
@ -150,6 +160,11 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate
return cmp;
}
@Override
public ICPPTemplateParameterMap getTemplateParameterMap() {
return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments());
}
@Override
public boolean isSameType(IType type) {
if (type instanceof ITypedef) {
@ -170,4 +185,17 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate
final ICPPClassTemplatePartialSpecialization rhs = (ICPPClassTemplatePartialSpecialization)type;
return CPPClassTemplatePartialSpecialization.isSamePartialClassSpecialization(this, rhs);
}
@Override
@Deprecated
public ObjectMap getArgumentMap() {
ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters();
ICPPTemplateArgument[] args= getTemplateArguments();
int len= Math.min(params.length, args.length);
ObjectMap result= new ObjectMap(len);
for (int i = 0; i < len; i++) {
result.put(params[i], args[i]);
}
return ObjectMap.EMPTY_MAP;
}
}

View file

@ -103,7 +103,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
public ICPPClassTemplate getPrimaryClassTemplate() {
if (fPrimaryTemplate == null) {
try {
long specializedRec = getDB().getRecPtr(record + PRIMARY_TEMPLATE);
int specializedRec = getDB().getInt(record + PRIMARY_TEMPLATE);
fPrimaryTemplate= (ICPPClassTemplate) getLinkage().getNode(specializedRec);
} catch (CoreException e) {
CCorePlugin.log(e);

View file

@ -161,9 +161,8 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization
ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding();
ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations();
ICPPClassTemplatePartialSpecialization[] spec = new ICPPClassTemplatePartialSpecialization[orig.length];
ICPPClassSpecialization owner = (ICPPClassSpecialization) getOwner();
for (int i = 0; i < orig.length; i++) {
spec[i]= (ICPPClassTemplatePartialSpecialization) owner.specializeMember(orig[i], point);
spec[i]= (ICPPClassTemplatePartialSpecialization) specializeMember(orig[i], point);
}
return spec;
}

View file

@ -46,6 +46,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecializationSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration;
@ -434,13 +435,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return null;
pdomBinding = createSpecialization(parent, pdomSpecialized, binding);
} else if (binding instanceof ICPPClassTemplatePartialSpecialization) {
ICPPClassTemplate primary = ((ICPPClassTemplatePartialSpecialization) binding).getPrimaryClassTemplate();
PDOMBinding pdomPrimary = addBinding(primary, null);
if (pdomPrimary instanceof PDOMCPPClassTemplate) {
pdomBinding = new PDOMCPPClassTemplatePartialSpecialization(
this, parent, (ICPPClassTemplatePartialSpecialization) binding, (PDOMCPPClassTemplate) pdomPrimary);
}
} else if (binding instanceof ICPPField) {
if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) {
pdomBinding = new PDOMCPPField(this, parent, (ICPPField) binding);
@ -565,6 +559,11 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
} else if (special instanceof ICPPClassType && orig instanceof ICPPClassType) {
result= new PDOMCPPClassInstance(this, parent, (ICPPClassType) special, orig);
}
} else if (special instanceof ICPPClassTemplatePartialSpecialization) {
if (orig instanceof PDOMCPPClassTemplate) {
result= new PDOMCPPClassTemplatePartialSpecialization(
this, parent, (ICPPClassTemplatePartialSpecialization) special, (PDOMCPPClassTemplate) orig);
}
} else if (special instanceof ICPPField) {
result= new PDOMCPPFieldSpecialization(this, parent, (ICPPField) special, orig);
} else if (special instanceof ICPPFunctionTemplate) {
@ -575,14 +574,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
} else if (special instanceof ICPPFunction) {
result= new PDOMCPPFunctionTemplateSpecialization(this, parent, (ICPPFunctionTemplate) special, orig);
}
} else if (special instanceof ICPPClassTemplatePartialSpecialization) {
ICPPClassTemplatePartialSpecialization partialSpecSpec = (ICPPClassTemplatePartialSpecialization) special;
ICPPClassTemplate primarySpec = partialSpecSpec.getPrimaryClassTemplate();
PDOMBinding pdomPrimarySpec = addBinding(primarySpec, null);
if (pdomPrimarySpec instanceof PDOMCPPClassTemplateSpecialization) {
result= new PDOMCPPClassTemplatePartialSpecializationSpecialization(this, parent, orig,
partialSpecSpec, (PDOMCPPClassTemplateSpecialization) pdomPrimarySpec);
}
} else if (special instanceof ICPPConstructor) {
result= new PDOMCPPConstructorSpecialization(this, parent, (ICPPConstructor) special, orig);
} else if (special instanceof ICPPMethod) {
@ -658,7 +649,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return CPP_CLASS_INSTANCE;
}
} else if (binding instanceof ICPPClassTemplatePartialSpecialization) {
return CPP_CLASS_TEMPLATE_PARTIAL_SPEC_SPEC;
if (binding instanceof ICPPClassTemplatePartialSpecializationSpecialization)
return CPP_CLASS_TEMPLATE_PARTIAL_SPEC_SPEC;
return CPP_CLASS_TEMPLATE_PARTIAL_SPEC;
} else if (binding instanceof ICPPField) {
return CPP_FIELD_SPECIALIZATION;
} else if (binding instanceof ICPPFunctionTemplate) {
@ -682,8 +675,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
} else if (binding instanceof ITypedef) {
return CPP_TYPEDEF_SPECIALIZATION;
}
} else if (binding instanceof ICPPClassTemplatePartialSpecialization) {
return CPP_CLASS_TEMPLATE_PARTIAL_SPEC;
} else if (binding instanceof ICPPTemplateParameter) {
if (binding instanceof ICPPTemplateTypeParameter) {
return CPP_TEMPLATE_TYPE_PARAMETER;