diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 9dbe8961888..d7a556fc512 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDoStatement; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionList; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; @@ -7036,6 +7037,32 @@ public class AST2Tests extends AST2BaseTest { assertTrue(((IFunction)n.resolveBinding()).getType().getParameterTypes()[0] instanceof IPointerType); } } + + + + + // + // /* check that enumerator values are evaluated correctly for + // * conditional expressions */ + // + //enum + //{ + // _ISalnum = 11 < 8 ? 1 : 2, + // _ISalnum2 = 11 > 8 ? 1 : 2 + //}; + // + public void testBug295851() throws Exception { + for(ParserLanguage lang : ParserLanguage.values()) { + IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); + IASTEnumerationSpecifier enumSpec = (IASTEnumerationSpecifier)((IASTSimpleDeclaration)tu.getDeclarations()[0]).getDeclSpecifier(); + IEnumerator enumeratorBinding = (IEnumerator)enumSpec.getEnumerators()[0].getName().resolveBinding(); + IValue value = enumeratorBinding.getValue(); + assertEquals( 2, value.numericalValue().longValue()); + IEnumerator enumeratorBinding2 = (IEnumerator)enumSpec.getEnumerators()[1].getName().resolveBinding(); + IValue value2 = enumeratorBinding2.getValue(); + assertEquals( 1, value2.numericalValue().longValue()); + } + } // // extern void goo(); // struct MyStruct { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index 15cc82d0489..0f6c173b0eb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -316,8 +316,8 @@ public class Value implements IValue { if (e instanceof IASTConditionalExpression) { IASTConditionalExpression cexpr= (IASTConditionalExpression) e; Object o= evaluate(cexpr.getLogicalConditionExpression(), unknownSigs, unknowns, maxdepth); - if (o instanceof Long) { - Long v= (Long) o; + if (o instanceof Number) { + Number v= (Number) o; if (v.longValue() == 0) { return evaluate(cexpr.getNegativeResultExpression(), unknownSigs, unknowns, maxdepth); } @@ -330,7 +330,7 @@ public class Value implements IValue { final IASTExpression pe = cexpr.getPositiveResultExpression(); Object po= pe == null ? o : evaluate(pe, unknownSigs, unknowns, maxdepth); Object neg= evaluate(cexpr.getNegativeResultExpression(), unknownSigs, unknowns, maxdepth); - return CONDITIONAL_CHAR + SEPARATOR + o.toString() + SEPARATOR + po.toString() + SEPARATOR + neg.toString(); + return "" + CONDITIONAL_CHAR + SEPARATOR + o.toString() + SEPARATOR + po.toString() + SEPARATOR + neg.toString(); //$NON-NLS-1$ } if (e instanceof IASTIdExpression) { IBinding b= ((IASTIdExpression) e).getName().resolvePreBinding(); @@ -462,8 +462,8 @@ public class Value implements IValue { return value; } - if (value instanceof Long) { - long v= (Long) value; + if (value instanceof Number) { + long v= ((Number) value).longValue(); switch(unaryOp) { case IASTUnaryExpression.op_prefixIncr: case IASTUnaryExpression.op_postFixIncr: @@ -504,9 +504,9 @@ public class Value implements IValue { } private static Object combineBinary(final int op, final Object o1, final Object o2) throws UnknownValueException { - if (o1 instanceof Long && o2 instanceof Long) { - long v1= (Long) o1; - long v2= (Long) o2; + if (o1 instanceof Number && o2 instanceof Number) { + long v1= ((Number) o1).longValue(); + long v2= ((Number) o2).longValue(); switch(op) { case IASTBinaryExpression.op_multiply: return v1*v2; @@ -601,8 +601,8 @@ public class Value implements IValue { if (reeval.pos != reeval.fExpression.length) return UNKNOWN; - if (obj instanceof Long) - return create(((Long) obj).longValue()); + if (obj instanceof Number) + return create(((Number) obj).longValue()); ICPPUnknownBinding[] ua; if (unknown.isEmpty()) { @@ -645,8 +645,8 @@ public class Value implements IValue { Object cond= reevaluate(reeval, maxdepth); Object po= reevaluate(reeval, maxdepth); Object neg= reevaluate(reeval, maxdepth); - if (cond instanceof Long) { - Long v= (Long) cond; + if (cond instanceof Number) { + Number v= (Number) cond; if (v.longValue() == 0) { return neg; }