From d6b443f67a9e9f98f87f22471682f769832df1f0 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 24 Feb 2014 16:46:02 +0100 Subject: [PATCH] Bug 428922: Class cast exception parsing expression ambiguity within delete expression. Signed-off-by: Markus Schorn --- .../core/parser/tests/ast2/AST2CPPTests.java | 18 ++++++++++++++++++ .../dom/parser/cpp/CPPASTDeleteExpression.java | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 470b5fc1bab..de73ada1fa2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -96,6 +96,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; @@ -6934,6 +6935,23 @@ public class AST2CPPTests extends AST2TestBase { parseAndCheckBindings(code, CPP); } + + // typedef struct xx{} type; + // void test(void* ptr) { + // delete (type)(ptr); + // } + public void testAmbiguityResolutionInDeleteExpression_428922() throws Exception { + final String code = getAboveComment(); + BindingAssertionHelper ba= new BindingAssertionHelper(code, true); + ba.assertNonProblem("type)", 4, ITypedef.class); + ba.assertNonProblem("ptr);", 3, ICPPVariable.class); + + IASTTranslationUnit tu = parseAndCheckBindings(code, CPP); + ICPPASTFunctionDefinition test= getDeclaration(tu, 1); + IASTExpressionStatement stmt= getStatement(test, 0); + ICPPASTDeleteExpression dexpr= (ICPPASTDeleteExpression) stmt.getExpression(); + assertTrue(dexpr.getOperand() instanceof ICPPASTCastExpression); + } // void f(int x); // diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeleteExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeleteExpression.java index 53dbdb8b89c..40a17c2b09d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeleteExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTDeleteExpression.java @@ -17,18 +17,21 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTImplicitName; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; +import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; -public class CPPASTDeleteExpression extends ASTNode implements ICPPASTDeleteExpression { +public class CPPASTDeleteExpression extends ASTNode implements ICPPASTDeleteExpression, IASTAmbiguityParent { private static final ICPPEvaluation EVALUATION = new EvalFixed(CPPSemantics.VOID_TYPE, PRVALUE, Value.UNKNOWN); private IASTExpression operand; @@ -186,4 +189,14 @@ public class CPPASTDeleteExpression extends ASTNode implements ICPPASTDeleteExpr public ValueCategory getValueCategory() { return PRVALUE; } + + @Override + public void replace(IASTNode child, IASTNode other) { + if (child == operand) { + other.setPropertyInParent(child.getPropertyInParent()); + other.setParent(child.getParent()); + operand = (IASTExpression) other; + } + } + }