mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
233460: apply fix
This commit is contained in:
parent
20daeeaec7
commit
05d113bc51
2 changed files with 62 additions and 13 deletions
|
@ -2684,4 +2684,32 @@ public class AST2TemplateTests extends AST2BaseTest {
|
||||||
ICPPTemplateTypeParameter T3b= ba.assertNonProblem("T3)", 2, ICPPTemplateTypeParameter.class);
|
ICPPTemplateTypeParameter T3b= ba.assertNonProblem("T3)", 2, ICPPTemplateTypeParameter.class);
|
||||||
ICPPClassType b= ba.assertNonProblem("B<>", 3, ICPPClassType.class, ICPPTemplateInstance.class);
|
ICPPClassType b= ba.assertNonProblem("B<>", 3, ICPPClassType.class, ICPPTemplateInstance.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// template<class T, int x> class A {public: class X {};};
|
||||||
|
// template<class T1> class A<T1,1> {public: class Y {};};
|
||||||
|
// template<class T2> class A<T2,2> {public: class Z {};};
|
||||||
|
//
|
||||||
|
// class B {};
|
||||||
|
//
|
||||||
|
// A<B, 0>::X x;
|
||||||
|
// A<B, 1>::Y y;
|
||||||
|
// A<B, 2>::Z z;
|
||||||
|
public void testNonTypeArgumentDisambiguation_233460() throws Exception {
|
||||||
|
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
|
||||||
|
ICPPClassType b2= ba.assertNonProblem("A<B, 0>", 7, ICPPClassType.class, ICPPTemplateInstance.class);
|
||||||
|
ICPPClassType b3= ba.assertNonProblem("A<B, 1>", 7, ICPPClassType.class, ICPPTemplateInstance.class);
|
||||||
|
ICPPClassType b4= ba.assertNonProblem("A<B, 2>", 7, ICPPClassType.class, ICPPTemplateInstance.class);
|
||||||
|
|
||||||
|
assertTrue(!b2.isSameType(b3));
|
||||||
|
assertTrue(!b3.isSameType(b4));
|
||||||
|
assertTrue(!b4.isSameType(b2));
|
||||||
|
|
||||||
|
ICPPClassType X= ba.assertNonProblem("X x", 1, ICPPClassType.class);
|
||||||
|
ICPPClassType Y= ba.assertNonProblem("Y y", 1, ICPPClassType.class);
|
||||||
|
ICPPClassType Z= ba.assertNonProblem("Z z", 1, ICPPClassType.class);
|
||||||
|
|
||||||
|
assertTrue(!X.isSameType(Y));
|
||||||
|
assertTrue(!Y.isSameType(Z));
|
||||||
|
assertTrue(!Z.isSameType(X));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
|
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.ICPPClassTemplatePartialSpecialization;
|
||||||
|
@ -1056,23 +1057,22 @@ public class CPPTemplates {
|
||||||
if (definition instanceof ICPPClassTemplatePartialSpecialization) {
|
if (definition instanceof ICPPClassTemplatePartialSpecialization) {
|
||||||
ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) definition;
|
ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) definition;
|
||||||
IASTNode[] args = ((ICPPASTTemplateId) name).getTemplateArguments();
|
IASTNode[] args = ((ICPPASTTemplateId) name).getTemplateArguments();
|
||||||
IType[] specArgs = null;
|
|
||||||
try {
|
try {
|
||||||
specArgs = spec.getArguments();
|
IType[] specArgs = spec.getArguments();
|
||||||
|
if (args.length == specArgs.length) {
|
||||||
|
int i = 0;
|
||||||
|
for (; i < args.length; i++) {
|
||||||
|
IType t1 = specArgs[i];
|
||||||
|
IType t2 = CPPVisitor.createType(args[i]);
|
||||||
|
if (isSameTemplateArgument(t1, t2))
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
result = (i == args.length);
|
||||||
|
}
|
||||||
} catch (DOMException e) {
|
} catch (DOMException e) {
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
if (specArgs != null && args.length == specArgs.length) {
|
|
||||||
int i = 0;
|
|
||||||
for (; i < args.length; i++) {
|
|
||||||
IType t1 = specArgs[i];
|
|
||||||
IType t2 = CPPVisitor.createType(args[i]);
|
|
||||||
if (t1 != null && t2 != null && t1.isSameType(t2))
|
|
||||||
continue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
result = (i == args.length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
result = CharArrayUtils.equals(definition.getNameCharArray(), name.toCharArray());
|
result = CharArrayUtils.equals(definition.getNameCharArray(), name.toCharArray());
|
||||||
|
@ -1087,6 +1087,27 @@ public class CPPTemplates {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param argA
|
||||||
|
* @param argB
|
||||||
|
* @return whether the two specified template arguments are the same
|
||||||
|
* @throws DOMException
|
||||||
|
*/
|
||||||
|
private static final boolean isSameTemplateArgument(IType argA, IType argB) throws DOMException {
|
||||||
|
// special case treatment for non-type integral parameters
|
||||||
|
if(argA instanceof ICPPBasicType && argB instanceof ICPPBasicType) {
|
||||||
|
IASTExpression eA= ((ICPPBasicType) argA).getValue();
|
||||||
|
IASTExpression eB= ((ICPPBasicType) argB).getValue();
|
||||||
|
if(eA != null && eB != null) {
|
||||||
|
return expressionsEquivalent(eA, eB);
|
||||||
|
} else if(eA == null ^ eB == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return argA != null && argB != null && argA.isSameType(argB);
|
||||||
|
}
|
||||||
|
|
||||||
static public IType[] createTypeArray(Object[] params) {
|
static public IType[] createTypeArray(Object[] params) {
|
||||||
if (params == null)
|
if (params == null)
|
||||||
return IType.EMPTY_TYPE_ARRAY;
|
return IType.EMPTY_TYPE_ARRAY;
|
||||||
|
|
Loading…
Add table
Reference in a new issue