1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 446380 - Problem with int(expression) in enumerator value

This commit is contained in:
Sergey Prigogin 2014-10-08 14:57:36 -07:00
parent 044d2cfaae
commit 06d5c452ce
2 changed files with 37 additions and 7 deletions

View file

@ -7607,6 +7607,35 @@ public class AST2CPPTests extends AST2TestBase {
assertEquals(IBasicType.IS_LONG, ((ICPPBasicType) t3).getModifiers());
}
// void f(int t);
// void f(long t);
//
// enum e {
// i1 = 0L,
// i2 = (long) i1 + 1,
// i3 = long(i2 + 1)
// };
//
// void test() {
// f(i3);
// }
public void testCastInEnumeratorValue_446380() throws Exception {
BindingAssertionHelper ba= getAssertionHelper();
IEnumerator i2 = ba.assertNonProblem("i2", IEnumerator.class);
Long v2 = i2.getValue().numericalValue();
assertNotNull(v2);
assertEquals(1, v2.intValue());
IEnumerator i3 = ba.assertNonProblem("i3", IEnumerator.class);
Long v3 = i3.getValue().numericalValue();
assertNotNull(v3);
assertEquals(2, v3.intValue());
ICPPFunction f = ba.assertNonProblemOnFirstIdentifier("f(i3)",ICPPFunction.class);
IType t = f.getType().getParameterTypes()[0];
// The declared types of the enum values don't affect the underlying type of the enum,
// only the values themselves do.
assertEquals("int", ASTTypeUtil.getType(t));
}
// typedef enum enum_name enum_name;
public void testTypedefRecursion_285457() throws Exception {
BindingAssertionHelper ba= getAssertionHelper();

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2012 Wind River Systems, Inc. and others.
* Copyright (c) 2008, 2014 Wind River Systems, Inc. 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
@ -56,6 +56,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
@ -531,7 +532,7 @@ public class Value implements IValue {
return null;
return applyBinaryTypeIdOperator(typeIdExp.getOperator(), t1, t2, exp);
}
if (exp instanceof IASTFunctionCallExpression) {
if (exp instanceof IASTFunctionCallExpression || exp instanceof ICPPASTSimpleTypeConstructorExpression) {
return null; // The value will be obtained from the evaluation.
}
return VALUE_CANNOT_BE_DETERMINED;