/******************************************************************************* * Copyright (c) 2005, 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Rational Software - Initial API and implementation * Anton Leherbauer (Wind River Systems) * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.parser.tests.ast2; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; 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.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNullStatement; import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; 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.IASTStandardFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICBasicType; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.dom.parser.c.CParameter; import org.eclipse.cdt.internal.core.dom.parser.c.CScope; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding; /** * @author dsteffle */ public class AST2KnRTests extends AST2BaseTest { public AST2KnRTests() { } public AST2KnRTests(String name) { super(name); } public void testSimpleKRCTest1() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(char x);\n" ); //$NON-NLS-1$ buffer.append( "int f(x) char x;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration f1 = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTFunctionDefinition f2 = (IASTFunctionDefinition)tu.getDeclarations()[1]; assertTrue( f1.getDeclarators()[0] instanceof IASTStandardFunctionDeclarator ); IParameter x4 = (IParameter)((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f2.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding(); IParameter x3 = (IParameter)((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName().resolveBinding(); IParameter x2 = (IParameter)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterNames()[0].resolveBinding(); IParameter x1 = (IParameter)((IASTStandardFunctionDeclarator)f1.getDeclarators()[0]).getParameters()[0].getDeclarator().getName().resolveBinding(); assertNotNull( x1 ); assertNotNull( x2 ); assertNotNull( x3 ); assertNotNull( x4 ); assertEquals( x1, x2 ); assertEquals( x2, x3 ); assertEquals( x3, x4 ); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(x1); assertEquals( decls.length, 2 ); assertEquals( decls[0], ((IASTStandardFunctionDeclarator)f1.getDeclarators()[0]).getParameters()[0].getDeclarator().getName() ); assertEquals( decls[1], ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName() ); assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)f2.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$ } public void testSimpleKRCTest2() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f();\n" ); //$NON-NLS-1$ buffer.append( "int f(x) char x;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration f1 = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTFunctionDefinition f2 = (IASTFunctionDefinition)tu.getDeclarations()[1]; assertTrue( f1.getDeclarators()[0] instanceof IASTStandardFunctionDeclarator ); IParameter x4 = (IParameter)((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f2.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding(); IParameter x3 = (IParameter)((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName().resolveBinding(); IParameter x2 = (IParameter)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterNames()[0].resolveBinding(); assertNotNull( x2 ); assertNotNull( x3 ); assertNotNull( x4 ); assertEquals( x2, x3 ); assertEquals( x3, x4 ); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(x2); assertEquals( decls.length, 1 ); assertEquals( decls[0], ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName() ); assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)f2.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$ } public void testSimpleKRCTest3() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int const *f();\n" ); //$NON-NLS-1$ buffer.append( "int const *f(x) char x;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration f1 = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTFunctionDefinition f2 = (IASTFunctionDefinition)tu.getDeclarations()[1]; assertTrue( f1.getDeclarators()[0] instanceof IASTStandardFunctionDeclarator ); IParameter x4 = (IParameter)((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f2.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding(); IParameter x3 = (IParameter)((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName().resolveBinding(); IParameter x2 = (IParameter)((ICASTKnRFunctionDeclarator)f2.getDeclarator()).getParameterNames()[0].resolveBinding(); assertNotNull( x2 ); assertNotNull( x3 ); assertNotNull( x4 ); assertEquals( x2, x3 ); assertEquals( x3, x4 ); } public void testKRC_1() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int isroot (x, y) /* comment */ \n" ); //$NON-NLS-1$ buffer.append( "int x;\n" ); //$NON-NLS-1$ buffer.append( "int y;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTFunctionDefinition isroot_def = (IASTFunctionDefinition)tu.getDeclarations()[0]; IASTName ret_x = ((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)isroot_def.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName(); IASTDeclarator isroot_decltor = isroot_def.getDeclarator(); assertTrue( isroot_decltor instanceof ICASTKnRFunctionDeclarator ); IASTDeclarator x1 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_decltor).getParameterDeclarations()[0]).getDeclarators()[0]; IASTDeclarator y1 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_decltor).getParameterDeclarations()[1]).getDeclarators()[0]; IParameter x_parm = (IParameter)x1.getName().resolveBinding(); IParameter y_parm = (IParameter)y1.getName().resolveBinding(); assertNotNull( x_parm ); assertNotNull( y_parm ); IASTDeclarator x2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_decltor).getParameterDeclarations()[0]).getDeclarators()[0]; IASTDeclarator y2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_decltor).getParameterDeclarations()[1]).getDeclarators()[0]; IParameter x_parm2 = (IParameter)x2.getName().resolveBinding(); IParameter y_parm2 = (IParameter)y2.getName().resolveBinding(); assertNotNull( x_parm2 ); assertNotNull( y_parm2 ); assertNotNull( ret_x.resolveBinding() ); assertEquals( x_parm, x_parm2 ); assertEquals( y_parm, y_parm2 ); assertEquals( ret_x.resolveBinding(), x_parm ); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(ret_x.resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], x1.getName() ); assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("isroot").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)isroot_def.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)isroot_def.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("y").toCharArray()) ); //$NON-NLS-1$ } public void testKRCWithTypes() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "typedef char c;\n" ); //$NON-NLS-1$ buffer.append( "int isroot (c);\n" ); //$NON-NLS-1$ buffer.append( "int isroot (x) \n" ); //$NON-NLS-1$ buffer.append( "c x;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration c_decl = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTSimpleDeclaration isroot_decl = (IASTSimpleDeclaration)tu.getDeclarations()[1]; IASTFunctionDefinition isroot_def = (IASTFunctionDefinition)tu.getDeclarations()[2]; //IASTName x0 = ((IASTStandardFunctionDeclarator)isroot_decl.getDeclarators()[0]).getParameters()[0].getDeclarator().getName(); IASTName x1 = ((ICASTKnRFunctionDeclarator)isroot_def.getDeclarator()).getParameterNames()[0]; IASTName x2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_def.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName(); IASTName x3 = ((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)isroot_def.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName(); IParameter x1_var = (IParameter)x1.resolveBinding(); IParameter x2_var = (IParameter)x2.resolveBinding(); IParameter x3_var = (IParameter)x3.resolveBinding(); assertNotNull(x1_var); assertNotNull(x2_var); assertNotNull(x3_var); assertEquals(x1_var, x2_var); assertEquals(x2_var, x3_var); IASTName c1 = c_decl.getDeclarators()[0].getName(); IASTName c2 = ((IASTNamedTypeSpecifier)((IASTStandardFunctionDeclarator)isroot_decl.getDeclarators()[0]).getParameters()[0].getDeclSpecifier()).getName(); IASTName c3 = ((IASTNamedTypeSpecifier)((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)isroot_def.getDeclarator()).getParameterDeclarations()[0]).getDeclSpecifier()).getName(); ITypedef c1_t = (ITypedef)c1.resolveBinding(); ITypedef c2_t = (ITypedef)c2.resolveBinding(); ITypedef c3_t = (ITypedef)c3.resolveBinding(); assertNotNull(c1_t); assertNotNull(c2_t); assertNotNull(c3_t); assertEquals(c1_t, c2_t); assertEquals(c2_t, c3_t); assertTrue(c1_t.getType() instanceof IBasicType); assertEquals(((IBasicType)c1_t.getType()).getType(), IBasicType.t_char); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(x3.resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], x2 ); assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("c").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("isroot").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)isroot_def.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$ } public void testKRCProblem1() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(x) char\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true, false ); IASTDeclaration[] decls= tu.getDeclarations(); assertTrue(CVisitor.getProblems(tu).length > 0); } public void testKRCProblem2() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int i=0;\n" ); //$NON-NLS-1$ buffer.append( "int f(x) i++;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true, false ); IASTSimpleDeclaration sd= getDeclaration(tu, 0); assertTrue(CVisitor.getProblems(tu).length > 0); } public void testKRCProblem3() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(x) char y;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true, false ); IASTFunctionDefinition f = (IASTFunctionDefinition)tu.getDeclarations()[0]; assertTrue(f.getDeclarator() instanceof ICASTKnRFunctionDeclarator); ICASTKnRFunctionDeclarator f_kr = (ICASTKnRFunctionDeclarator)f.getDeclarator(); assertEquals(f_kr.getName().toString(), "f"); //$NON-NLS-1$ assertEquals(f_kr.getParameterNames()[0].toString(), "x"); //$NON-NLS-1$ assertTrue(f_kr.getParameterDeclarations()[0] instanceof IASTProblemDeclaration); assertTrue(f.getBody() instanceof IASTCompoundStatement); assertTrue(((IASTCompoundStatement)f.getBody()).getStatements()[0] instanceof IASTReturnStatement); assertTrue(((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue() instanceof IASTBinaryExpression); assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1() instanceof IASTIdExpression); assertEquals(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().toString(), "x"); //$NON-NLS-1$ assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2() instanceof IASTLiteralExpression); assertEquals(((IASTLiteralExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2()).toString(), "0"); //$NON-NLS-1$ // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding()); assertEquals( decls.length, 0 ); } public void testKRCProblem4() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(x,y,z) char x,y,z; int a;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true, false ); IASTFunctionDefinition f = (IASTFunctionDefinition)tu.getDeclarations()[0]; assertTrue(f.getDeclarator() instanceof ICASTKnRFunctionDeclarator); ICASTKnRFunctionDeclarator f_kr = (ICASTKnRFunctionDeclarator)f.getDeclarator(); assertEquals(f_kr.getName().toString(), "f"); //$NON-NLS-1$ assertEquals(f_kr.getParameterNames()[0].toString(), "x"); //$NON-NLS-1$ assertTrue(f_kr.getParameterDeclarations()[0] instanceof IASTSimpleDeclaration); assertTrue(f_kr.getParameterDeclarations()[1] instanceof IASTProblemDeclaration); assertTrue(f.getBody() instanceof IASTCompoundStatement); assertTrue(((IASTCompoundStatement)f.getBody()).getStatements()[0] instanceof IASTReturnStatement); assertTrue(((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue() instanceof IASTBinaryExpression); assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1() instanceof IASTIdExpression); assertEquals(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().toString(), "x"); //$NON-NLS-1$ assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2() instanceof IASTLiteralExpression); assertEquals(((IASTLiteralExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2()).toString(), "0"); //$NON-NLS-1$ // bindings should still be ok IASTName x1 = f_kr.getParameterNames()[0]; IASTName y1 = f_kr.getParameterNames()[1]; IASTName z1 = f_kr.getParameterNames()[2]; IASTName x2 = ((IASTSimpleDeclaration)f_kr.getParameterDeclarations()[0]).getDeclarators()[0].getName(); IASTName y2 = ((IASTSimpleDeclaration)f_kr.getParameterDeclarations()[0]).getDeclarators()[1].getName(); IASTName z2 = ((IASTSimpleDeclaration)f_kr.getParameterDeclarations()[0]).getDeclarators()[2].getName(); IASTName x3 = ((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName(); IParameter x1_parm = (IParameter)x1.resolveBinding(); IParameter x2_parm = (IParameter)x2.resolveBinding(); IParameter x3_parm = (IParameter)x3.resolveBinding(); IParameter y1_parm = (IParameter)y1.resolveBinding(); IParameter y2_parm = (IParameter)y2.resolveBinding(); IParameter z1_parm = (IParameter)z1.resolveBinding(); IParameter z2_parm = (IParameter)z2.resolveBinding(); assertEquals(x1_parm, x2_parm); assertEquals(x2_parm, x3_parm); assertEquals(y1_parm, y2_parm); assertEquals(z1_parm, z2_parm); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], x2 ); } public void testKRCProblem5() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(x) char x,a;\n" ); //$NON-NLS-1$ buffer.append( "{ return x == 0; }\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true, false ); IASTFunctionDefinition f = (IASTFunctionDefinition)tu.getDeclarations()[0]; assertTrue(f.getDeclarator() instanceof ICASTKnRFunctionDeclarator); ICASTKnRFunctionDeclarator f_kr = (ICASTKnRFunctionDeclarator)f.getDeclarator(); assertEquals(f_kr.getName().toString(), "f"); //$NON-NLS-1$ assertEquals(f_kr.getParameterNames()[0].toString(), "x"); //$NON-NLS-1$ assertTrue(f_kr.getParameterDeclarations()[0] instanceof IASTProblemDeclaration); assertTrue(f.getBody() instanceof IASTCompoundStatement); assertTrue(((IASTCompoundStatement)f.getBody()).getStatements()[0] instanceof IASTReturnStatement); assertTrue(((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue() instanceof IASTBinaryExpression); assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1() instanceof IASTIdExpression); assertEquals(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().toString(), "x"); //$NON-NLS-1$ assertTrue(((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2() instanceof IASTLiteralExpression); assertEquals(((IASTLiteralExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand2()).toString(), "0"); //$NON-NLS-1$ // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(((IASTIdExpression)((IASTBinaryExpression)((IASTReturnStatement)((IASTCompoundStatement)f.getBody()).getStatements()[0]).getReturnValue()).getOperand1()).getName().resolveBinding()); assertEquals( decls.length, 0 ); } public void testKRC_monop_cards1() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "#ifdef __STDC__\n" ); //$NON-NLS-1$ buffer.append( "#define __P(x) x\n" ); //$NON-NLS-1$ buffer.append( "#else\n" ); //$NON-NLS-1$ buffer.append( "#define __P(x) ()\n" ); //$NON-NLS-1$ buffer.append( "#endif\n" ); //$NON-NLS-1$ buffer.append( "struct A_struct {\n" ); //$NON-NLS-1$ buffer.append( "int a;\n" ); //$NON-NLS-1$ buffer.append( "long *c;\n" ); //$NON-NLS-1$ buffer.append( "};\n" ); //$NON-NLS-1$ buffer.append( "typedef struct A_struct A;\n" ); //$NON-NLS-1$ buffer.append( "static void f __P((A *));\n" ); //$NON-NLS-1$ buffer.append( "static void\n" ); //$NON-NLS-1$ buffer.append( "f(x)\n" ); //$NON-NLS-1$ buffer.append( "A *x; {\n" ); //$NON-NLS-1$ buffer.append( "x->a = 0;\n" ); //$NON-NLS-1$ buffer.append( "x->c[1]=x->c[2];\n" ); //$NON-NLS-1$ buffer.append( "}\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration A_struct = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTSimpleDeclaration A = (IASTSimpleDeclaration)tu.getDeclarations()[1]; IASTSimpleDeclaration f_decl = (IASTSimpleDeclaration)tu.getDeclarations()[2]; IASTFunctionDefinition f_def = (IASTFunctionDefinition)tu.getDeclarations()[3]; // check A_struct assertTrue( A_struct.getDeclSpecifier() instanceof IASTCompositeTypeSpecifier ); assertEquals( A_struct.getDeclarators().length, 0 ); IASTName A_struct_name1 = ((IASTCompositeTypeSpecifier)A_struct.getDeclSpecifier()).getName(); assertEquals( A_struct_name1.toString(), "A_struct" ); //$NON-NLS-1$ ICompositeType A_struct_type1 = (ICompositeType)A_struct_name1.resolveBinding(); assertEquals( ((ICInternalBinding)A_struct_type1).getPhysicalNode(), ((IASTCompositeTypeSpecifier)A_struct.getDeclSpecifier()).getName() ); IField[] fields = A_struct_type1.getFields(); IField a1 = fields[0]; IField c1 = fields[1]; assertEquals( a1.getName().toString(), "a" ); //$NON-NLS-1$ assertEquals( c1.getName().toString(), "c" ); //$NON-NLS-1$ IBasicType a1_t = (IBasicType)a1.getType(); IPointerType c1_t = (IPointerType)c1.getType(); assertEquals( a1_t.getType(), IBasicType.t_int ); assertTrue( c1_t.getType() instanceof IBasicType ); assertTrue( ((IBasicType)c1_t.getType()).isLong() ); // check A IASTName A_name1 = A.getDeclarators()[0].getName(); assertEquals( A_name1.toString(), "A" ); //$NON-NLS-1$ ITypedef A_var1 = (ITypedef)A_name1.resolveBinding(); assertTrue( A.getDeclSpecifier() instanceof IASTElaboratedTypeSpecifier ); IASTName A_struct_name_2 = ((IASTElaboratedTypeSpecifier)A.getDeclSpecifier()).getName(); assertEquals( A_struct_name_2.toString(), "A_struct" ); //$NON-NLS-1$ assertEquals( ((IASTElaboratedTypeSpecifier)A.getDeclSpecifier()).getStorageClass(), IASTDeclSpecifier.sc_typedef ); ICompositeType A_struct_type2 = (ICompositeType)A_struct_name_2.resolveBinding(); assertEquals( A_struct_type2, A_struct_type1 ); // check f_decl assertTrue( f_decl.getDeclarators()[0] instanceof IASTStandardFunctionDeclarator ); IASTStandardFunctionDeclarator f_decltor1 = ((IASTStandardFunctionDeclarator)f_decl.getDeclarators()[0]); IASTName f_name1 = f_decltor1.getName(); IFunction f_fun1 = (IFunction)f_name1.resolveBinding(); assertEquals( f_name1.toString(), "f" ); //$NON-NLS-1$ assertEquals( f_decltor1.getParameters().length, 1 ); //IASTName x0 = f_decltor1.getParameters()[0].getDeclarator().getName(); IASTName A_name2 = ((ICASTTypedefNameSpecifier)f_decltor1.getParameters()[0].getDeclSpecifier()).getName(); assertEquals( A_name2.toString(), "A" ); //$NON-NLS-1$ ITypedef A_var2 = (ITypedef)A_name2.resolveBinding(); assertEquals( A_var1, A_var2 ); // check f_def assertTrue( f_def.getDeclarator() instanceof ICASTKnRFunctionDeclarator ); ICASTKnRFunctionDeclarator f_decltor2 = (ICASTKnRFunctionDeclarator)f_def.getDeclarator(); assertEquals( f_decltor2.getName().toString(), "f" ); //$NON-NLS-1$ IFunction f_fun2 = (IFunction)f_decltor2.getName().resolveBinding(); assertEquals( f_fun1, f_fun2 ); ICBasicType f_ret_t = (ICBasicType)f_fun2.getType().getReturnType(); assertEquals( f_ret_t.getType(), IBasicType.t_void ); IASTName x1 = f_decltor2.getParameterNames()[0]; assertEquals( x1.toString(), "x" ); //$NON-NLS-1$ IASTSimpleDeclaration x_parm = (IASTSimpleDeclaration)f_decltor2.getParameterDeclarations()[0]; IASTName x2 = x_parm.getDeclarators()[0].getName(); assertEquals( x2.toString(), "x" ); //$NON-NLS-1$ assertEquals( x_parm.getDeclarators()[0].getPointerOperators().length, 1 ); IASTName A3 = ((IASTNamedTypeSpecifier)x_parm.getDeclSpecifier()).getName(); ITypedef A_var3 = (ITypedef)A3.resolveBinding(); assertEquals( A_var2, A_var3 ); assertEquals( A3.toString(), "A" ); //$NON-NLS-1$; assertEquals( x1.resolveBinding(), x2.resolveBinding() ); // check f_def body assertTrue( f_def.getBody() instanceof IASTCompoundStatement ); IASTCompoundStatement f_def_body = (IASTCompoundStatement)f_def.getBody(); IASTExpressionStatement stmt1 = (IASTExpressionStatement)f_def_body.getStatements()[0]; IASTExpressionStatement stmt2 = (IASTExpressionStatement)f_def_body.getStatements()[1]; IASTName a2 = ((IASTFieldReference)((IASTBinaryExpression)stmt1.getExpression()).getOperand1()).getFieldName(); assertEquals( ((IASTName)((ICInternalBinding)a1).getPhysicalNode()).resolveBinding(), a2.resolveBinding() ); IASTName x3 = ((IASTIdExpression)((IASTFieldReference)((IASTBinaryExpression)stmt1.getExpression()).getOperand1()).getFieldOwner()).getName(); assertEquals( x2.resolveBinding(), x3.resolveBinding() ); assertEquals( ((IASTBinaryExpression)stmt1.getExpression()).getOperand2().toString(), "0" ); //$NON-NLS-1$ assertTrue( ((IASTBinaryExpression)stmt2.getExpression()).getOperand1() instanceof IASTArraySubscriptExpression ); assertTrue( ((IASTBinaryExpression)stmt2.getExpression()).getOperand2() instanceof IASTArraySubscriptExpression ); IASTName c2 = ((IASTFieldReference)((IASTArraySubscriptExpression)((IASTBinaryExpression)stmt2.getExpression()).getOperand1()).getArrayExpression()).getFieldName(); IASTName x4 = ((IASTIdExpression)((IASTFieldReference)((IASTArraySubscriptExpression)((IASTBinaryExpression)stmt2.getExpression()).getOperand1()).getArrayExpression()).getFieldOwner()).getName(); IASTName c3 = ((IASTFieldReference)((IASTArraySubscriptExpression)((IASTBinaryExpression)stmt2.getExpression()).getOperand2()).getArrayExpression()).getFieldName(); IASTName x5 = ((IASTIdExpression)((IASTFieldReference)((IASTArraySubscriptExpression)((IASTBinaryExpression)stmt2.getExpression()).getOperand1()).getArrayExpression()).getFieldOwner()).getName(); assertEquals( ((IASTName)((ICInternalBinding)c1).getPhysicalNode()).resolveBinding(), c2.resolveBinding() ); assertEquals( ((IASTName)((ICInternalBinding)c1).getPhysicalNode()).resolveBinding(), c3.resolveBinding() ); assertEquals( x3.resolveBinding(), x4.resolveBinding() ); assertEquals( x4.resolveBinding(), x5.resolveBinding() ); // test CFunction.getParameters size IParameter[] f1_parms = f_fun1.getParameters(); assertEquals( f1_parms.length, 1 ); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(x2.resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], x2 ); assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_TAG, new String("A_struct").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("A").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)tu.getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("f").toCharArray()) ); //$NON-NLS-1$ assertNotNull( ((CScope)((IASTCompoundStatement)f_def.getBody()).getScope()).getBinding(CScope.NAMESPACE_TYPE_OTHER, new String("x").toCharArray()) ); //$NON-NLS-1$ } public void testKRC_monop_cards2() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int\n" ); //$NON-NLS-1$ buffer.append( "getinp(prompt, list)\n" ); //$NON-NLS-1$ buffer.append( " const char *prompt, *const list[];\n" ); //$NON-NLS-1$ buffer.append( "{\n *list[1] = 'a';\n}\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTFunctionDefinition getinp = (IASTFunctionDefinition)tu.getDeclarations()[0]; IASTName prompt1 = ((ICASTKnRFunctionDeclarator)getinp.getDeclarator()).getParameterNames()[0]; IASTName list1 = ((ICASTKnRFunctionDeclarator)getinp.getDeclarator()).getParameterNames()[1]; IASTName prompt2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)getinp.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName(); IASTName list2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)getinp.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[1].getName(); IASTName list3 = ((IASTIdExpression)((IASTArraySubscriptExpression)((IASTUnaryExpression)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)getinp.getBody()).getStatements()[0]).getExpression()).getOperand1()).getOperand()).getArrayExpression()).getName(); assertEquals( prompt1.resolveBinding(), prompt2.resolveBinding() ); assertEquals( list1.resolveBinding(), list2.resolveBinding() ); assertEquals( list2.resolveBinding(), list3.resolveBinding() ); IASTSimpleDeclaration parm_decl = (IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)getinp.getDeclarator()).getParameterDeclarations()[0]; assertTrue( ((IASTSimpleDeclSpecifier)parm_decl.getDeclSpecifier()).isConst() ); assertEquals( ((IASTSimpleDeclSpecifier)parm_decl.getDeclSpecifier()).getType(), IASTSimpleDeclSpecifier.t_char ); IASTDeclarator prompt = parm_decl.getDeclarators()[0]; IASTArrayDeclarator list = (IASTArrayDeclarator)parm_decl.getDeclarators()[1]; assertEquals( prompt.getName().toString(), "prompt" ); //$NON-NLS-1$ assertEquals( prompt.getPointerOperators().length, 1 ); assertEquals( list.getName().toString(), "list" ); //$NON-NLS-1$ assertEquals( list.getArrayModifiers().length, 1 ); assertNull( list.getArrayModifiers()[0].getConstantExpression() ); assertEquals( list.getPointerOperators().length, 1 ); // test tu.getDeclarationsInAST(IBinding) IASTName[] decls = tu.getDeclarationsInAST(list3.resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], list2 ); decls = tu.getDeclarationsInAST(prompt1.resolveBinding()); assertEquals( decls.length, 1 ); assertEquals( decls[0], prompt2 ); } public void testKRC_getParametersOrder() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "int f(a, b) int b,a;{}\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTFunctionDefinition f = (IASTFunctionDefinition)tu.getDeclarations()[0]; ICASTKnRFunctionDeclarator f_decltor = (ICASTKnRFunctionDeclarator)f.getDeclarator(); IFunction f_fun = (IFunction)f_decltor.getName().resolveBinding(); IParameter [] f_parms = f_fun.getParameters(); assertEquals( f_parms.length, 2 ); assertEquals( ((CParameter)f_parms[0]).getName(), "a" ); //$NON-NLS-1$ assertEquals( ((CParameter)f_parms[1]).getName(), "b" ); //$NON-NLS-1$ } public void testKRC_Ethereal_1() throws Exception { StringBuffer buffer = new StringBuffer(); //$NON-NLS-1$ buffer.append( "struct symbol {\n" ); //$NON-NLS-1$ buffer.append( "int lambda;\n};\n" ); //$NON-NLS-1$ buffer.append( "struct lemon {\n" ); //$NON-NLS-1$ buffer.append( "struct symbol **symbols;\n" ); //$NON-NLS-1$ buffer.append( "int errorcnt;\n};\n" ); //$NON-NLS-1$ buffer.append( "void f(lemp)\n" ); //$NON-NLS-1$ buffer.append( "struct lemon *lemp;\n{\n" ); //$NON-NLS-1$ buffer.append( "lemp->symbols[1]->lambda = 1;\n" ); //$NON-NLS-1$ buffer.append( "lemp->errorcnt++;}\n" ); //$NON-NLS-1$ IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C, true ); IASTSimpleDeclaration symbol_decl = (IASTSimpleDeclaration)tu.getDeclarations()[0]; IASTSimpleDeclaration lemon_decl = (IASTSimpleDeclaration)tu.getDeclarations()[1]; IASTFunctionDefinition f_def = (IASTFunctionDefinition)tu.getDeclarations()[2]; IASTName symbol_name1 = ((IASTCompositeTypeSpecifier)symbol_decl.getDeclSpecifier()).getName(); IASTName lambda_name1 = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)symbol_decl.getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); IASTName lemon_name1 = ((IASTCompositeTypeSpecifier)lemon_decl.getDeclSpecifier()).getName(); IASTName symbol_name2 = ((IASTElaboratedTypeSpecifier)((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)lemon_decl.getDeclSpecifier()).getMembers()[0]).getDeclSpecifier()).getName(); IASTName symbols_name1 = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)lemon_decl.getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); IASTName errorcnt_name1 = ((IASTSimpleDeclaration)((IASTCompositeTypeSpecifier)lemon_decl.getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); IASTName lemp_name1 = ((ICASTKnRFunctionDeclarator)f_def.getDeclarator()).getParameterNames()[0]; IASTName lemon_name2 = ((IASTElaboratedTypeSpecifier)((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f_def.getDeclarator()).getParameterDeclarations()[0]).getDeclSpecifier()).getName(); IASTName lemp_name2 = ((IASTSimpleDeclaration)((ICASTKnRFunctionDeclarator)f_def.getDeclarator()).getParameterDeclarations()[0]).getDeclarators()[0].getName(); IASTName lemp_name3 = ((IASTIdExpression)((IASTFieldReference)((IASTArraySubscriptExpression)((IASTFieldReference)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)f_def.getBody()).getStatements()[0]).getExpression()).getOperand1()).getFieldOwner()).getArrayExpression()).getFieldOwner()).getName(); IASTName symbols_name2 = ((IASTFieldReference)((IASTArraySubscriptExpression)((IASTFieldReference)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)f_def.getBody()).getStatements()[0]).getExpression()).getOperand1()).getFieldOwner()).getArrayExpression()).getFieldName(); IASTName lambda_name2 = ((IASTFieldReference)((IASTBinaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)f_def.getBody()).getStatements()[0]).getExpression()).getOperand1()).getFieldName(); IASTName lemp_name4 = ((IASTIdExpression)((IASTFieldReference)((IASTUnaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)f_def.getBody()).getStatements()[1]).getExpression()).getOperand()).getFieldOwner()).getName(); IASTName errorcnt_name2 = ((IASTFieldReference)((IASTUnaryExpression)((IASTExpressionStatement)((IASTCompoundStatement)f_def.getBody()).getStatements()[1]).getExpression()).getOperand()).getFieldName(); assertEquals( symbol_name1.resolveBinding(), symbol_name2.resolveBinding() ); assertEquals( lambda_name1.resolveBinding(), lambda_name2.resolveBinding() ); assertEquals( lemon_name1.resolveBinding(), lemon_name2.resolveBinding() ); assertEquals( symbols_name1.resolveBinding(), symbols_name2.resolveBinding() ); assertEquals( errorcnt_name1.resolveBinding(), errorcnt_name2.resolveBinding() ); assertEquals( lemp_name1.resolveBinding(), lemp_name2.resolveBinding() ); assertEquals( lemp_name2.resolveBinding(), lemp_name3.resolveBinding() ); assertEquals( lemp_name3.resolveBinding(), lemp_name4.resolveBinding() ); } public void testBug97447() throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append("void f( a ) int a; {} \n"); //$NON-NLS-1$ buffer.append("void f( int ); \n"); //$NON-NLS-1$ IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C, true); CNameCollector col = new CNameCollector(); tu.accept(col); IFunction def = (IFunction) col.getName(0).resolveBinding(); IFunction f1 = (IFunction) col.getName(3).resolveBinding(); IParameter a = (IParameter) col.getName(4).resolveBinding(); } public void testBug100104() throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append("typedef int ush;\n"); //$NON-NLS-1$ buffer.append("int f()\n"); //$NON-NLS-1$ buffer.append("{\n"); //$NON-NLS-1$ buffer.append("int a=1;\n"); //$NON-NLS-1$ buffer.append("((ush)(a)*(ush)(a) * a);\n"); //$NON-NLS-1$ buffer.append("{\n"); //$NON-NLS-1$ buffer.append("};\n"); //$NON-NLS-1$ buffer.append("}\n"); //$NON-NLS-1$ IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C, true, true); assertTrue( tu.getDeclarations()[0] instanceof IASTSimpleDeclaration ); assertTrue( tu.getDeclarations()[1] instanceof IASTFunctionDefinition ); IASTStatement[] stmts = ((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[1]).getBody()).getStatements(); assertTrue( stmts[0] instanceof IASTDeclarationStatement ); assertTrue( stmts[1] instanceof IASTExpressionStatement ); assertTrue( stmts[2] instanceof IASTCompoundStatement ); assertTrue( stmts[3] instanceof IASTNullStatement ); } // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=203050 public void testBug203050() throws Exception { StringBuffer buffer = new StringBuffer(); buffer.append("typedef long time_t;\n" + //$NON-NLS-1$ "\n" + //$NON-NLS-1$ "void (foo)(timep)\n" + //$NON-NLS-1$ " const time_t * const timep;\n" + //$NON-NLS-1$ "{\n" + //$NON-NLS-1$ " struct tm tmp;\n" + //$NON-NLS-1$ " bar(timep, &tmp);\n" + //$NON-NLS-1$ "}\n" + //$NON-NLS-1$ "int (bar)(timep, tmp)\n" + //$NON-NLS-1$ " const time_t * const timep;\n" + //$NON-NLS-1$ " struct tm * tmp;\n" + //$NON-NLS-1$ "{\n" + //$NON-NLS-1$ " return 0;\n" + //$NON-NLS-1$ "}\n"); //$NON-NLS-1$ IASTTranslationUnit tu = parse(buffer.toString(), ParserLanguage.C, true, true); assertTrue( tu.getDeclarations()[0] instanceof IASTSimpleDeclaration ); assertTrue( tu.getDeclarations()[1] instanceof IASTFunctionDefinition ); assertTrue( tu.getDeclarations()[2] instanceof IASTFunctionDefinition ); IASTStatement[] stmts = ((IASTCompoundStatement)((IASTFunctionDefinition)tu.getDeclarations()[1]).getBody()).getStatements(); assertTrue( stmts[0] instanceof IASTDeclarationStatement ); assertTrue( stmts[1] instanceof IASTExpressionStatement ); IASTExpression expr= ((IASTExpressionStatement)stmts[1]).getExpression(); assertTrue(expr instanceof IASTFunctionCallExpression); IASTIdExpression fnameExpr= (IASTIdExpression)((IASTFunctionCallExpression)expr).getFunctionNameExpression(); fnameExpr.getName().resolveBinding(); IASTName fname= ((IASTFunctionDefinition)tu.getDeclarations()[2]).getDeclarator().getName(); try { fname.resolveBinding(); } catch (StackOverflowError e) { fail(e.getMessage()); } } }