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

Fixed testFunctionTemplateWithUsing test case.

This commit is contained in:
Sergey Prigogin 2008-04-28 05:35:38 +00:00
parent 6aa23c119f
commit 98cf46261c
2 changed files with 86 additions and 101 deletions

View file

@ -2074,7 +2074,7 @@ public class AST2TemplateTests extends AST2BaseTest {
// using ns::pair;
// using ns::make_pair;
// pair<int, int> p = make_pair(1, 2);
public void _testFunctionTemplateWithUsing() throws Exception {
public void testFunctionTemplateWithUsing() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction fn= bh.assertNonProblem("make_pair(1", 9, ICPPFunction.class);
}

View file

@ -540,9 +540,9 @@ public class CPPSemantics {
else
obj = ArrayUtil.addAll(Object.class, (Object[])obj, (Object[]) so);
} else {
if (so instanceof IBinding || so instanceof IASTName)
if (so instanceof IBinding || so instanceof IASTName) {
obj = new Object[] { obj, so };
else {
} else {
Object[] temp = new Object[((Object[])so).length + 1];
temp[0] = obj;
obj = ArrayUtil.addAll(Object.class, temp, (Object[]) so);
@ -668,8 +668,7 @@ public class CPPSemantics {
}
if ((!data.contentAssist && (data.problem != null || data.hasResults())) ||
(friendInLocalClass && !(scope instanceof ICPPClassScope)))
{
(friendInLocalClass && !(scope instanceof ICPPClassScope))) {
return;
}
@ -779,8 +778,9 @@ public class CPPSemantics {
} else if (data.astName != null) {
inherited = parent.getBindings(data.astName, true, data.prefixLookup);
}
} else
} else {
inherited = lookupInScope(data, parent, null);
}
if (inherited == null || data.contentAssist) {
Object temp = lookupInParents(data, parent);
@ -990,7 +990,7 @@ public class CPPSemantics {
if (data == null) {
data = new LookupData();
}
final boolean isIndexBased= data.tu == null ? false : data.tu.getIndex() != null;
final boolean isIndexBased= data.tu != null && data.tu.getIndex() != null;
Object possible = null;
IASTNode[] nodes = null;
IASTNode parent = ASTInternal.getPhysicalNodeOfScope(scope);
@ -1440,14 +1440,13 @@ public class CPPSemantics {
public static IBinding resolveAmbiguities(IASTName name, Object[] bindings) {
bindings = ArrayUtil.trim(Object.class, bindings);
if (bindings == null || bindings.length == 0)
if (bindings == null || bindings.length == 0) {
return null;
else if (bindings.length == 1) {
} else if (bindings.length == 1) {
if (bindings[0] instanceof IBinding)
return (IBinding) bindings[0];
else if (bindings[0] instanceof IASTName && ((IASTName) bindings[0]).getBinding() != null)
return ((IASTName) bindings[0]).getBinding();
}
if (name.getPropertyInParent() != STRING_LOOKUP_PROPERTY) {
@ -1517,8 +1516,8 @@ public class CPPSemantics {
if (pointOfDecl < 0 && nd != null) {
ASTNodeProperty prop = nd.getPropertyInParent();
//point of declaration for a name is immediately after its complete declarator and before its initializer
if (prop == IASTDeclarator.DECLARATOR_NAME || nd instanceof IASTDeclarator) {
// point of declaration for a name is immediately after its complete declarator and before its initializer
IASTDeclarator dtor = (IASTDeclarator)((nd instanceof IASTDeclarator) ? nd : nd.getParent());
while (dtor.getParent() instanceof IASTDeclarator)
dtor = (IASTDeclarator) dtor.getParent();
@ -1527,9 +1526,8 @@ public class CPPSemantics {
pointOfDecl = ((ASTNode)init).getOffset() - 1;
else
pointOfDecl = ((ASTNode)dtor).getOffset() + ((ASTNode)dtor).getLength();
}
//point of declaration for an enumerator is immediately after it enumerator-definition
else if (prop == IASTEnumerator.ENUMERATOR_NAME) {
} else if (prop == IASTEnumerator.ENUMERATOR_NAME) {
// point of declaration for an enumerator is immediately after it enumerator-definition
IASTEnumerator enumtor = (IASTEnumerator) nd.getParent();
if (enumtor.getValue() != null) {
ASTNode exp = (ASTNode) enumtor.getValue();
@ -1543,8 +1541,9 @@ public class CPPSemantics {
} else if (prop == ICPPASTNamespaceAlias.ALIAS_NAME) {
nd = (ASTNode) nd.getParent();
pointOfDecl = nd.getOffset() + nd.getLength();
} else
} else {
pointOfDecl = nd.getOffset() + nd.getLength();
}
}
return (pointOfDecl < pointOfRef);
}
@ -1553,7 +1552,7 @@ public class CPPSemantics {
if (!data.hasResults() || data.contentAssist)
return null;
final boolean indexBased= data.tu == null ? false : data.tu.getIndex() != null;
final boolean indexBased= data.tu != null && data.tu.getIndex() != null;
@SuppressWarnings("unchecked")
ObjectSet<IFunction> fns= ObjectSet.EMPTY_SET, templateFns= ObjectSet.EMPTY_SET;
IBinding type = null;
@ -1570,9 +1569,9 @@ public class CPPSemantics {
if (!name.isReference()) {
checkResolvedNamesOnly= true;
declaredBefore= true;
}
else
} else {
continue;
}
}
if (o instanceof IASTName) {
IASTName on= (IASTName) o;
@ -1581,8 +1580,9 @@ public class CPPSemantics {
continue;
} else if (o instanceof IBinding) {
temp = (IBinding) o;
} else
} else {
continue;
}
if (!(temp instanceof ICPPMember) && !declaredBefore)
continue;
@ -1610,8 +1610,7 @@ public class CPPSemantics {
if (!fnsFromAST) {
fns.put(function);
}
}
else {
} else {
if (!fnsFromAST) {
fns.clear();
fnsFromAST= true;
@ -1623,19 +1622,17 @@ public class CPPSemantics {
if (type == null) {
type = temp;
} else if (type instanceof ICPPClassTemplate && temp instanceof ICPPSpecialization &&
((IType) type).isSameType((IType) ((ICPPSpecialization)temp).getSpecializedBinding()))
{
//ok, stay with the template, the specialization, if applicable, will come out during instantiation
((IType) type).isSameType((IType) ((ICPPSpecialization)temp).getSpecializedBinding())) {
// ok, stay with the template, the specialization, if applicable, will come out during instantiation
} else if (type != temp && !((IType)type).isSameType((IType) temp)) {
return new ProblemBinding(data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name());
}
} else {
if (obj == null)
if (obj == null) {
obj = temp;
else if (obj == temp) {
} else if (obj == temp) {
//ok, delegates are synonyms
}
else {
} else {
// ignore index stuff in case we have bindings from the ast
boolean ibobj= isFromIndex(obj);
boolean ibtemp= isFromIndex(temp);
@ -1643,9 +1640,9 @@ public class CPPSemantics {
if (ibobj != ibtemp) {
if (ibobj)
obj= temp;
}
else
} else {
return new ProblemBinding(data.astName, IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, data.name());
}
}
}
}
@ -1660,6 +1657,7 @@ public class CPPSemantics {
// if (fns == null) return type;
bindings = (IBinding[]) ArrayUtil.append(IBinding.class, bindings, type);
bindings = (IBinding[]) ArrayUtil.addAll(IBinding.class, bindings, fns.keyArray());
bindings = (IBinding[]) ArrayUtil.addAll(IBinding.class, bindings, templateFns.keyArray());
}
bindings = (IBinding[]) ArrayUtil.trim(IBinding.class, bindings);
ICPPUsingDeclaration composite = new CPPUsingDeclaration(data.astName, bindings);
@ -1669,7 +1667,7 @@ public class CPPSemantics {
int numTemplateFns = templateFns.size();
if (numTemplateFns > 0) {
if (data.functionParameters != null && !data.forDefinition()) {
IFunction[] fs = CPPTemplates.selectTemplateFunctions(templateFns, data.functionParameters, data.astName);
IFunction[] fs = CPPTemplates.selectTemplateFunctions(templateFns, data.functionParameters, data.astName);
if (fs != null && fs.length > 0) {
if (fns == ObjectSet.EMPTY_SET)
fns = new ObjectSet<IFunction>(fs.length);
@ -1728,7 +1726,7 @@ public class CPPSemantics {
int numParameters = (fParams != null) ? fParams.length : 0;
int num;
boolean def = data.forDefinition();
//Trim the list down to the set of viable functions
// Trim the list down to the set of viable functions
IFunction function = null;
int size = functions.length;
for (int i = 0; i < size && functions[i] != null; i++) {
@ -1739,16 +1737,15 @@ public class CPPSemantics {
}
num = function.getParameters().length;
//if there are m arguments in the list, all candidate functions having m parameters
//are viable
// if there are m arguments in the list, all candidate functions having m parameters
// are viable
if (num == numParameters) {
if (def && !isMatchingFunctionDeclaration(function, data)) {
functions[i] = null;
}
continue;
}
//check for void
else if (numParameters == 0 && num == 1) {
} else if (numParameters == 0 && num == 1) {
// check for void
IParameter param = function.getParameters()[0];
IType t = param.getType();
if (t instanceof IBasicType && ((IBasicType)t).getType() == IBasicType.t_void)
@ -1756,25 +1753,24 @@ public class CPPSemantics {
}
if (def) {
//if this is for a definition, we had to match the number of parameters.
// if this is for a definition, we had to match the number of parameters.
functions[i] = null;
continue;
}
//A candidate function having fewer than m parameters is viable only if it has an
//ellipsis in its parameter list.
if (num < numParameters) {
// A candidate function having fewer than m parameters is viable only if it has an
// ellipsis in its parameter list.
if (function.takesVarArgs())
continue;
//not enough parameters, remove it
// not enough parameters, remove it
functions[i] = null;
}
//a candidate function having more than m parameters is viable only if the (m+1)-st
//parameter has a default argument
else {
} else {
//a candidate function having more than m parameters is viable only if the (m+1)-st
//parameter has a default argument
IParameter[] params = function.getParameters();
for (int j = num - 1; j >= numParameters; j--) {
if (!((ICPPParameter)params[j]).hasDefaultValue()) {
if (!((ICPPParameter) params[j]).hasDefaultValue()) {
functions[i] = null;
break;
}
@ -1957,8 +1953,9 @@ public class CPPSemantics {
} else {
target = targetParameters[j];
}
} else
} else {
varArgs = true;
}
if (isImpliedObject && ASTInternal.isStatic(currFn, false)) {
//13.3.1-4 for static member functions, the implicit object parameter is considered to match any object
@ -2012,23 +2009,22 @@ public class CPPSemantics {
ambiguous |= (hasWorse && hasBetter) || (!hasWorse && !hasBetter);
if (!hasWorse) {
//if they are both template functions, we can order them that way
// if they are both template functions, we can order them that way
boolean bestIsTemplate = (bestFn instanceof ICPPSpecialization &&
((ICPPSpecialization)bestFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
((ICPPSpecialization) bestFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
boolean currIsTemplate = (currFn instanceof ICPPSpecialization &&
((ICPPSpecialization)currFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
((ICPPSpecialization) currFn).getSpecializedBinding() instanceof ICPPFunctionTemplate);
if (bestIsTemplate && currIsTemplate) {
ICPPFunctionTemplate t1 = (ICPPFunctionTemplate) ((ICPPSpecialization)bestFn).getSpecializedBinding();
ICPPFunctionTemplate t2 = (ICPPFunctionTemplate) ((ICPPSpecialization)currFn).getSpecializedBinding();
ICPPFunctionTemplate t1 = (ICPPFunctionTemplate) ((ICPPSpecialization) bestFn).getSpecializedBinding();
ICPPFunctionTemplate t2 = (ICPPFunctionTemplate) ((ICPPSpecialization) currFn).getSpecializedBinding();
int order = CPPTemplates.orderTemplateFunctions(t1, t2);
if (order < 0) {
hasBetter = true;
} else if (order > 0) {
ambiguous = false;
}
}
//we prefer normal functions over template functions, unless we specified template arguments
else if (bestIsTemplate && !currIsTemplate) {
} else if (bestIsTemplate && !currIsTemplate) {
// we prefer normal functions over template functions, unless we specified template arguments
if (data.preferTemplateFunctions())
ambiguous = false;
else
@ -2038,7 +2034,6 @@ public class CPPSemantics {
hasBetter = true;
else
ambiguous = false;
}
if (hasBetter) {
//the new best function.
@ -2129,8 +2124,8 @@ public class CPPSemantics {
ASTNodeProperty prop = null;
while (node != null) {
prop = node.getPropertyInParent();
//target is an object or reference being initialized
if (prop == IASTDeclarator.INITIALIZER) {
// target is an object or reference being initialized
IASTDeclarator dtor = (IASTDeclarator) node.getParent();
return CPPVisitor.createType(dtor);
} else if (prop == IASTInitializerExpression.INITIALIZER_EXPRESSION) {
@ -2140,21 +2135,18 @@ public class CPPSemantics {
return CPPVisitor.createType(dtor);
}
return null;
}
//target is the left side of an assignment
else if (prop == IASTBinaryExpression.OPERAND_TWO &&
((IASTBinaryExpression)node.getParent()).getOperator() == IASTBinaryExpression.op_assign)
{
} else if (prop == IASTBinaryExpression.OPERAND_TWO &&
((IASTBinaryExpression)node.getParent()).getOperator() == IASTBinaryExpression.op_assign) {
// target is the left side of an assignment
IASTBinaryExpression binaryExp = (IASTBinaryExpression) node.getParent();
IASTExpression exp = binaryExp.getOperand1();
return CPPVisitor.getExpressionType(exp);
}
//target is a parameter of a function
else if (prop == IASTFunctionCallExpression.PARAMETERS ||
(prop == IASTExpressionList.NESTED_EXPRESSION && node.getParent().getPropertyInParent() == IASTFunctionCallExpression.PARAMETERS))
{
//if this function call refers to an overloaded function, there is more than one possiblity
//for the target type
} else if (prop == IASTFunctionCallExpression.PARAMETERS ||
(prop == IASTExpressionList.NESTED_EXPRESSION &&
node.getParent().getPropertyInParent() == IASTFunctionCallExpression.PARAMETERS)) {
// target is a parameter of a function
// if this function call refers to an overloaded function, there is more than one possiblity
// for the target type
IASTFunctionCallExpression fnCall = null;
int idx = -1;
if (prop == IASTFunctionCallExpression.PARAMETERS) {
@ -2185,15 +2177,12 @@ public class CPPSemantics {
result = (IType[]) ArrayUtil.append(IType.class, result, pts[idx]);
}
return result;
}
//target is an explicit type conversion
else if (prop == IASTCastExpression.OPERAND)
{
} else if (prop == IASTCastExpression.OPERAND) {
// target is an explicit type conversion
IASTCastExpression cast = (IASTCastExpression) node.getParent();
return CPPVisitor.createType(cast.getTypeId().getAbstractDeclarator());
}
//target is a template non-type parameter (14.3.2-5)
else if (prop == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT) {
} else if (prop == ICPPASTTemplateId.TEMPLATE_ID_ARGUMENT) {
//target is a template non-type parameter (14.3.2-5)
ICPPASTTemplateId id = (ICPPASTTemplateId) node.getParent();
IASTNode[] args = id.getTemplateArguments();
int i = 0;
@ -2213,10 +2202,8 @@ public class CPPSemantics {
return null;
}
}
}
//target is the return value of a function, operator or conversion
else if (prop == IASTReturnStatement.RETURNVALUE)
{
} else if (prop == IASTReturnStatement.RETURNVALUE) {
// target is the return value of a function, operator or conversion
while (!(node instanceof IASTFunctionDefinition)) {
node = node.getParent();
}
@ -2231,13 +2218,10 @@ public class CPPSemantics {
} catch (DOMException e) {
}
}
}
else if (prop == IASTUnaryExpression.OPERAND) {
} else if (prop == IASTUnaryExpression.OPERAND) {
IASTUnaryExpression parent = (IASTUnaryExpression) node.getParent();
if (parent.getOperator() == IASTUnaryExpression.op_bracketedPrimary ||
parent.getOperator() == IASTUnaryExpression.op_amper)
{
parent.getOperator() == IASTUnaryExpression.op_amper) {
node = parent;
continue;
}
@ -2267,14 +2251,15 @@ public class CPPSemantics {
for (int i = 0; i < items.length; i++) {
Object o = items[i];
if (o == null) break;
if (o instanceof IASTName)
if (o instanceof IASTName) {
temp = ((IASTName) o).resolveBinding();
else if (o instanceof IBinding) {
} else if (o instanceof IBinding) {
temp = (IBinding) o;
if (!declaredBefore(temp, name, isIndexBased))
continue;
} else
} else {
continue;
}
try {
if (temp instanceof IFunction) {
@ -2364,8 +2349,7 @@ public class CPPSemantics {
return contentAssistLookup(data, name);
}
private static IBinding[] contentAssistLookup(LookupData data, Object start) {
try {
lookup(data, start);
@ -2380,9 +2364,9 @@ public class CPPSemantics {
for (int i = 0; i < size; i++) {
key = map.keyAt(i);
obj = map.get(key);
if (obj instanceof IBinding)
if (obj instanceof IBinding) {
result = (IBinding[]) ArrayUtil.append(IBinding.class, result, obj);
else if (obj instanceof IASTName) {
} else if (obj instanceof IASTName) {
IBinding binding = ((IASTName) obj).resolveBinding();
if (binding != null && !(binding instanceof IProblemBinding))
result = (IBinding[]) ArrayUtil.append(IBinding.class, result, binding);
@ -2390,18 +2374,18 @@ public class CPPSemantics {
Object[] objs = (Object[]) obj;
for (int j = 0; j < objs.length && objs[j] != null; j++) {
Object item = objs[j];
if (item instanceof IBinding)
if (item instanceof IBinding) {
result = (IBinding[]) ArrayUtil.append(IBinding.class, result, item);
else if (item instanceof IASTName) {
} else if (item instanceof IASTName) {
IBinding binding = ((IASTName) item).resolveBinding();
if (binding != null && !(binding instanceof IProblemBinding))
result = (IBinding[]) ArrayUtil.append(IBinding.class, result, binding);
}
}
}
}
}
}
return (IBinding[]) ArrayUtil.trim(IBinding.class, result);
}
@ -2419,18 +2403,19 @@ public class CPPSemantics {
ObjectSet<IBinding> set = new ObjectSet<IBinding>(items.length);
IBinding binding = null;
for (int i = 0; i < items.length; i++) {
if (items[i] instanceof IASTName)
if (items[i] instanceof IASTName) {
binding = ((IASTName) items[i]).resolveBinding();
else if (items[i] instanceof IBinding)
} else if (items[i] instanceof IBinding) {
binding = (IBinding) items[i];
else
} else {
binding = null;
}
if (binding != null) {
if (binding instanceof ICPPUsingDeclaration) {
set.addAll(((ICPPUsingDeclaration)binding).getDelegates());
set.addAll(((ICPPUsingDeclaration) binding).getDelegates());
} else if (binding instanceof CPPCompositeBinding) {
set.addAll(((CPPCompositeBinding)binding).getBindings());
set.addAll(((CPPCompositeBinding) binding).getBindings());
} else {
set.put(binding);
}