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 2e15f1a19c6..df79bf45fb0 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 @@ -13,6 +13,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.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; @@ -31,8 +32,10 @@ import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTStatement; 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.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; @@ -3277,6 +3280,8 @@ public class AST2CPPTests extends AST2BaseTest { assertEquals( expression.getInitialValue(), null ); assertEquals( expression.getSimpleType(), ICPPASTSimpleTypeConstructorExpression.t_int ); } + + public void testBug90498_1() throws Exception { IASTTranslationUnit tu = parse( "typedef INT ( FOO ) (INT);", ParserLanguage.CPP ); //$NON-NLS-1$ @@ -3309,14 +3314,50 @@ public class AST2CPPTests extends AST2BaseTest { assertNotNull( dtor.getInitializer() ); } + + public void testBug866274() throws Exception { + StringBuffer buffer = new StringBuffer( "class D { /* ... */ };\n" ); //$NON-NLS-1$ + buffer.append( "D d1;\n"); //$NON-NLS-1$ + buffer.append( "const D d2;\n"); //$NON-NLS-1$ + buffer.append( "void foo() {\n"); //$NON-NLS-1$ + buffer.append( " typeid(d1) == typeid(d2);\n"); //$NON-NLS-1$ + buffer.append( " typeid(D) == typeid(d2);\n"); //$NON-NLS-1$ + buffer.append( "}\n"); //$NON-NLS-1$ + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + IASTFunctionDefinition foo = (IASTFunctionDefinition) tu.getDeclarations()[3]; + IASTCompoundStatement cs = (IASTCompoundStatement) foo.getBody(); + IASTStatement [] subs = cs.getStatements(); + for( int i = 0; i < subs.length; ++i ) + { + IASTBinaryExpression be = (IASTBinaryExpression) ((IASTExpressionStatement)subs[i]).getExpression(); + if( i == 1 ) + { + IASTTypeIdExpression expression = (IASTTypeIdExpression) be.getOperand1(); + IASTTypeId typeId = expression.getTypeId(); + assertTrue( ((IASTNamedTypeSpecifier)typeId.getDeclSpecifier()).getName().resolveBinding() instanceof IType ); + } + else + { + IASTUnaryExpression expression = (IASTUnaryExpression) be.getOperand1(); + IASTIdExpression idExpression = (IASTIdExpression) expression.getOperand(); + assertTrue( idExpression.getName().resolveBinding() instanceof IVariable ); + } + IASTUnaryExpression expression = (IASTUnaryExpression) be.getOperand2(); + IASTIdExpression idExpression = (IASTIdExpression) expression.getOperand(); + assertTrue( idExpression.getName().resolveBinding() instanceof IVariable ); + + } + } + + public void testTypedefFunction() throws Exception { IASTTranslationUnit tu = parse( "typedef int foo (int);", ParserLanguage.CPP ); //$NON-NLS-1$ CPPNameCollector col = new CPPNameCollector(); - tu.accept( col ); - - IBinding binding = col.getName(0).resolveBinding(); - assertTrue( binding instanceof ITypedef ); - assertTrue( ((ITypedef)binding).getType() instanceof IFunctionType ); + tu.accept( col ); + + IBinding binding = col.getName(0).resolveBinding(); + assertTrue( binding instanceof ITypedef ); + assertTrue( ((ITypedef)binding).getType() instanceof IFunctionType ); } } 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 cb9b42e8ecc..9123804aef7 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 @@ -44,7 +44,6 @@ 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.ICPPASTFunctionDeclarator; @@ -393,7 +392,7 @@ public class DOMLocationTests extends AST2BaseTest { IASTBinaryExpression bexp = (IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu .getDeclarations()[3]).getBody()).getStatements()[0]) .getExpression(); - IASTTypeIdExpression exp = (IASTTypeIdExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu + IASTUnaryExpression exp = (IASTUnaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu .getDeclarations()[3]).getBody()).getStatements()[0]) .getExpression()).getOperand1(); @@ -402,7 +401,7 @@ public class DOMLocationTests extends AST2BaseTest { 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 + exp = (IASTUnaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu .getDeclarations()[3]).getBody()).getStatements()[0]) .getExpression()).getOperand2(); assertSoleLocation(exp, 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 7a5c52d0e90..5e709f744b6 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 @@ -1444,10 +1444,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { boolean isTypeId = true; IASTExpression lhs = null; IASTTypeId typeId = null; - + IToken m = mark(); try { - typeId = typeId(false, false); + boolean amb = false; + if ( LT(1) == IToken.tIDENTIFIER ) + amb = true; + typeId = typeId(false, false); + if( amb && typeId.getDeclSpecifier() instanceof IASTNamedTypeSpecifier ) + { + if( ! queryIsTypeName( ((IASTNamedTypeSpecifier) typeId.getDeclSpecifier()).getName() ) ) + { + backup( m ); + throwBacktrack( ((CPPASTNode)typeId).getOffset(), ((CPPASTNode)typeId).getLength() ); + } + } } catch (BacktrackException b) { + typeId = null; isTypeId = false; lhs = expression(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index d359545408b..45f3a42f5fe 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -1207,7 +1207,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { protected static class _FunctionMacroDefinition extends _MacroDefinition implements _IPreprocessorDirective { - public final char[][] parms; + private final char[][] parms; /** * @param parent @@ -1221,6 +1221,10 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { super(parent, startOffset, endOffset, name, nameOffset, expansion); this.parms = parameters; } + + public char[][] getParms() { + return parms; + } } protected static class _Problem extends _Context { @@ -1351,7 +1355,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { r = new ASTObjectMacro(); else if (d instanceof _FunctionMacroDefinition) { IASTPreprocessorFunctionStyleMacroDefinition f = new ASTFunctionMacro(); - char[][] parms = ((_FunctionMacroDefinition) d).parms; + char[][] parms = ((_FunctionMacroDefinition) d).getParms(); for (int j = 0; j < parms.length; ++j) { IASTFunctionStyleMacroParameter parm = new ASTFunctionMacroParameter(); parm.setParameter(new String(parms[j])); @@ -2454,7 +2458,7 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { } public IMacroDefinition registerBuiltinFunctionStyleMacro(FunctionStyleMacro macro) { - IMacroDefinition result = new _FunctionMacroDefinition( tu, -1, -1, macro.name, -1, macro.expansion, macro.arglist ); + IMacroDefinition result = new _FunctionMacroDefinition( tu, -1, -1, macro.name, -1, macro.expansion, removeNullArguments( macro.arglist ) ); tu.addBuiltinMacro( result ); return result; }