From e10d1e3719543da608f02b288ab86e5b43282a0c Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 26 Jun 2012 09:41:29 +0200 Subject: [PATCH] Bug 299911: Preserving typedefs in the evaluation. --- .../dom/parser/cpp/semantics/EvalBinary.java | 22 ++++++++++--------- .../cpp/semantics/EvalFunctionCall.java | 9 ++++++-- .../cpp/semantics/EvalMemberAccess.java | 6 ++--- .../dom/parser/cpp/semantics/EvalUnary.java | 11 +++++----- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinary.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinary.java index 6f5c0d98f17..5f90c8de82e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinary.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinary.java @@ -13,9 +13,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.glvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.prvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.typeFromFunctionCall; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.*; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.REF; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; @@ -92,7 +90,9 @@ public class EvalBinary implements ICPPEvaluation { } else { ICPPFunction overload = getOverload(point); if (overload != null) { - fType= ExpressionTypes.typeFromFunctionCall(overload); + fType= ExpressionTypes.restoreTypedefs( + ExpressionTypes.typeFromFunctionCall(overload), + fArg1.getTypeOrFunctionSet(point), fArg2.getTypeOrFunctionSet(point)); } else { fType= computeType(point); } @@ -189,19 +189,21 @@ public class EvalBinary implements ICPPEvaluation { if (o != null) return typeFromFunctionCall(o); - IType type1 = prvalueType(fArg1.getTypeOrFunctionSet(point)); + final IType originalType1 = fArg1.getTypeOrFunctionSet(point); + final IType type1 = prvalueTypeWithResolvedTypedefs(originalType1); if (type1 instanceof ISemanticProblem) { return type1; } - IType type2 = prvalueType(fArg2.getTypeOrFunctionSet(point)); + final IType originalType2 = fArg2.getTypeOrFunctionSet(point); + final IType type2 = prvalueTypeWithResolvedTypedefs(originalType2); if (type2 instanceof ISemanticProblem) { return type2; } IType type= CPPArithmeticConversion.convertCppOperandTypes(fOperator, type1, type2); if (type != null) { - return type; + return ExpressionTypes.restoreTypedefs(type, originalType1, originalType2); } @@ -227,10 +229,10 @@ public class EvalBinary implements ICPPEvaluation { case IASTBinaryExpression.op_plus: if (type1 instanceof IPointerType) { - return type1; + return ExpressionTypes.restoreTypedefs(type1, originalType1); } if (type2 instanceof IPointerType) { - return type2; + return ExpressionTypes.restoreTypedefs(type2, originalType2); } break; @@ -239,7 +241,7 @@ public class EvalBinary implements ICPPEvaluation { if (type2 instanceof IPointerType) { return CPPVisitor.getPointerDiffType(point); } - return type1; + return originalType1; } break; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java index d0925faec8a..dde693d47b3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalFunctionCall.java @@ -112,7 +112,8 @@ public class EvalFunctionCall implements ICPPEvaluation { return ExpressionTypes.typeFromFunctionCall(overload); - IType t= SemanticUtil.getNestedType(fArguments[0].getTypeOrFunctionSet(point), TDEF|REF|CVTYPE); + final ICPPEvaluation arg0 = fArguments[0]; + IType t= SemanticUtil.getNestedType(arg0.getTypeOrFunctionSet(point), TDEF|REF|CVTYPE); if (t instanceof ICPPClassType) { return new ProblemType(ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION); } @@ -121,7 +122,11 @@ public class EvalFunctionCall implements ICPPEvaluation { t= SemanticUtil.getNestedType(((IPointerType) t).getType(), TDEF | REF | CVTYPE); } if (t instanceof IFunctionType) { - return typeFromReturnType(((IFunctionType) t).getReturnType()); + t = typeFromReturnType(((IFunctionType) t).getReturnType()); + if (arg0 instanceof EvalMemberAccess) { + t= ExpressionTypes.restoreTypedefs(t, ((EvalMemberAccess) arg0).getOwnerType()); + } + return t; } return new ProblemType(ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java index d3ea8f9a23c..8123662d07d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java @@ -14,9 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.XVALUE; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.glvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.prvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.typeFromFunctionCall; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.*; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.*; import java.util.Collection; @@ -182,7 +180,7 @@ public class EvalMemberAccess implements ICPPEvaluation { type= SemanticUtil.mapToAST(type, point); } - IType prValue= prvalueType(type); + IType prValue= prvalueTypeWithResolvedTypedefs(type); if (prValue instanceof IPointerType) { return glvalueType(((IPointerType) prValue).getType()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java index 578dcbfe230..3faecff3a4c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalUnary.java @@ -14,9 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE; import static org.eclipse.cdt.core.dom.ast.IASTUnaryExpression.*; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.glvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.prvalueType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.valueCategoryFromFunctionCall; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.*; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.REF; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; @@ -162,7 +160,7 @@ public class EvalUnary implements ICPPEvaluation { return new CPPPointerType(fArgument.getTypeOrFunctionSet(point)); case op_star: IType type= fArgument.getTypeOrFunctionSet(point); - type = prvalueType(type); + type = prvalueTypeWithResolvedTypedefs(type); if (type instanceof IPointerType) { return glvalueType(((IPointerType) type).getType()); } @@ -179,8 +177,9 @@ public class EvalUnary implements ICPPEvaluation { case op_plus: case op_tilde: final IType t1 = prvalueType(fArgument.getTypeOrFunctionSet(point)); - final IType t2= CPPArithmeticConversion.promoteCppType(t1); - return t2 != null ? t2 : t1; + final IType t2 = SemanticUtil.getNestedType(t1, TDEF); + final IType t3= CPPArithmeticConversion.promoteCppType(t2); + return (t3 == null || t3 == t2) ? t1 : t3; } return fArgument.getTypeOrFunctionSet(point); }