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 13ffac302af..81fdb9ed76f 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 @@ -72,10 +72,13 @@ import org.eclipse.cdt.core.dom.ast.c.ICArrayType; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.c.ICScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.parser.c.CFunction; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.parser.ParserException; /** @@ -2816,4 +2819,48 @@ public class AST2Tests extends AST2BaseTest { assertTrue( star.isVariableSized() ); } + + public void testBug84696() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "struct A {\n int a; \n};\n" ); //$NON-NLS-1$ + buffer.append( "struct B: virtual A { };\n" ); //$NON-NLS-1$ + buffer.append( "struct C: B { };\n" ); //$NON-NLS-1$ + buffer.append( "struct D: B { };\n" ); //$NON-NLS-1$ + buffer.append( "struct E: public C, public D { };\n" ); //$NON-NLS-1$ + buffer.append( "struct F: public A { };\n" ); //$NON-NLS-1$ + buffer.append( "void f() {\n" ); //$NON-NLS-1$ + buffer.append( "E e;\n" ); //$NON-NLS-1$ + buffer.append( "e.B::a = 0;\n" ); //$NON-NLS-1$ + buffer.append( "F f;\n" ); //$NON-NLS-1$ + buffer.append( "f.A::a = 1;\n}\n" ); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); + CPPNameCollector col = new CPPNameCollector(); + CPPVisitor.visitTranslationUnit(tu, col); + + assertEquals(col.size(), 26); + + ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding(); + ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding(); + + assertNotNull(A); + assertNotNull(B); + + assertInstances( col, A, 4 ); + assertInstances( col, B, 4 ); + } + + public void testBug84466() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "struct B {};\n" ); //$NON-NLS-1$ + buffer.append( "struct D : B {};\n" ); //$NON-NLS-1$ + buffer.append( "void foo(D* dp)\n{\n" ); //$NON-NLS-1$ + buffer.append( "B* bp = dynamic_cast(dp);\n}\n" ); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.CPP); + ICPPASTCastExpression dynamic_cast = (ICPPASTCastExpression)((IASTInitializerExpression)((IASTSimpleDeclaration)((IASTDeclarationStatement)((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[2]).getBody()).getStatements()[0]).getDeclaration()).getDeclarators()[0].getInitializer()).getExpression(); + + assertEquals(dynamic_cast.getOperator(), ICPPASTCastExpression.op_dynamic_cast); + + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java index 07342a90851..686d66ffbf2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java @@ -10,6 +10,7 @@ **********************************************************************/ package org.eclipse.cdt.core.parser.tests.ast2; +import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTCastExpression; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression; @@ -18,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; @@ -37,9 +39,12 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.parser.ParserException; @@ -328,5 +333,26 @@ public class DOMLocationTests extends AST2BaseTest { assertSoleLocation( third_if, third_if_start, total_if_end - third_if_start ); } } + + public void testBug84467() throws Exception + { + String code = "class D { };\n D d1;\n const D d2;\n void foo() {\n typeid(d1) == typeid(d2);\n }"; //$NON-NLS-1$ + IASTTranslationUnit tu = parse( code, ParserLanguage.CPP ); + IASTBinaryExpression bexp = (IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[3]).getBody()).getStatements()[0]).getExpression(); + IASTTypeIdExpression exp = (IASTTypeIdExpression)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[3]).getBody()).getStatements()[0]).getExpression()).getOperand1(); + + assertSoleLocation( bexp, code.indexOf( "typeid(d1) == typeid(d2)"), "typeid(d1) == typeid(d2)".length() ); //$NON-NLS-1$ //$NON-NLS-2$ + assertSoleLocation( exp, code.indexOf( "typeid(d1)"), "typeid(d1)".length() ); //$NON-NLS-1$ //$NON-NLS-2$ + exp = (IASTTypeIdExpression)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[3]).getBody()).getStatements()[0]).getExpression()).getOperand2(); + assertSoleLocation( exp, code.indexOf( "typeid(d2)"), "typeid(d2)".length() ); //$NON-NLS-1$ //$NON-NLS-2$ + } + + public void testBug84576() throws Exception + { + String code = "namespace A {\n extern \"C\" int g();\n }"; //$NON-NLS-1$ + IASTTranslationUnit tu = parse( code, ParserLanguage.CPP ); + ICPPASTLinkageSpecification spec = (ICPPASTLinkageSpecification)((ICPPASTNamespaceDefinition)tu.getDeclarations()[0]).getDeclarations()[0]; + assertSoleLocation( spec, code.indexOf( "extern \"C\""), "extern \"C\"".length() ); //$NON-NLS-1$ //$NON-NLS-2$ + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java index 75e77638e78..383c2ed0f87 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java @@ -10,14 +10,14 @@ **********************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import org.eclipse.cdt.core.dom.ast.IASTCastExpression; import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; /** * @author jcamelon */ public class CPPASTCastExpression extends CPPASTUnaryExpression implements - IASTCastExpression { + ICPPASTCastExpression { private IASTTypeId typeId; /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 2c16005e809..cfb8a379b15 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -808,7 +808,8 @@ public class CPPVisitor { prop == ICPPASTPointerToMember.NAME || prop == ICPPASTTypenameExpression.TYPENAME || prop == ICPPASTUsingDeclaration.NAME || - prop == ICPPASTQualifiedName.SEGMENT_NAME) + prop == ICPPASTQualifiedName.SEGMENT_NAME || + prop == ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.NAME) break; else if( prop == IASTElaboratedTypeSpecifier.TYPE_NAME ){ IASTNode p = name.getParent().getParent(); @@ -827,7 +828,8 @@ public class CPPVisitor { prop == ICPPASTUsingDeclaration.NAME || prop == IASTFunctionCallExpression.FUNCTION_NAME || prop == ICPPASTUsingDeclaration.NAME || - prop == ICPPASTQualifiedName.SEGMENT_NAME) + prop == ICPPASTQualifiedName.SEGMENT_NAME || + prop == IASTNamedTypeSpecifier.NAME) { break; } @@ -842,7 +844,8 @@ public class CPPVisitor { return PROCESS_CONTINUE; } - if( CharArrayUtils.equals(name.toCharArray(), binding.getNameCharArray()) && + if( binding != null && + CharArrayUtils.equals(name.toCharArray(), binding.getNameCharArray()) && name.resolveBinding() == binding ){ if( refs.length == idx ){ IASTName [] temp = new IASTName[ refs.length * 2 ]; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index e51624f2eb2..3cc2c0aedd2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -147,6 +147,10 @@ import org.eclipse.cdt.internal.core.parser.token.TokenFactory; */ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { + private static final String CONST_CAST = "const_cast"; //$NON-NLS-1$ + private static final String REINTERPRET_CAST = "reinterpret_cast"; //$NON-NLS-1$ + private static final String STATIC_CAST = "static_cast"; //$NON-NLS-1$ + private static final String DYNAMIC_CAST = "dynamic_cast"; //$NON-NLS-1$ private static final int DEFAULT_CATCH_HANDLER_LIST_SIZE = 4; private ScopeStack templateIdScopes = new ScopeStack(); protected CPPASTTranslationUnit translationUnit; @@ -1422,7 +1426,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { isTypeId = false; lhs = expression(); } - lastOffset = consume(IToken.tRPAREN).getOffset(); + lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); } @@ -1784,7 +1788,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected IASTExpression specialCastExpression(int kind) throws EndOfFileException, BacktrackException { int startingOffset = LA(1).getOffset(); - consume(); + IToken op = consume(); consume(IToken.tLT); IASTTypeId typeID = typeId(false, false); consume(IToken.tGT); @@ -1797,6 +1801,19 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { typeID.setParent(result); typeID.setPropertyInParent(IASTCastExpression.TYPE_ID); result.setOperand(lhs); + + if (op.toString().equals(DYNAMIC_CAST)) { + result.setOperator(ICPPASTCastExpression.op_dynamic_cast); + } else if (op.toString().equals(STATIC_CAST)) { + result.setOperator(ICPPASTCastExpression.op_static_cast); + } else if (op.toString().equals(REINTERPRET_CAST)) { + result.setOperator(ICPPASTCastExpression.op_reinterpret_cast); + } else if (op.toString().equals(CONST_CAST)) { + result.setOperator(ICPPASTCastExpression.op_const_cast); + } else { + result.setOperator(IASTCastExpression.op_cast); + } + lhs.setParent(result); lhs.setPropertyInParent(IASTCastExpression.OPERAND); return result; @@ -1929,6 +1946,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { ICPPASTLinkageSpecification linkage = createLinkageSpecification(); ((ASTNode) linkage).setOffset(firstToken.getOffset()); linkage.setLiteral(spec.getImage()); + ((ASTNode) linkage).setLength(spec.getEndOffset() - firstToken.getOffset()); if (LT(1) == IToken.tLBRACE) { consume(IToken.tLBRACE);