| /******************************************************************************* |
| * Copyright (c) 2004, 2016 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: |
| * Doug Schaefer (IBM) - Initial API and implementation |
| * Markus Schorn (Wind River Systems) |
| * Andrew Ferguson (Symbian) |
| * Sergey Prigogin (Google) |
| * Thomas Corbat (IFS) |
| * Anders Dahlberg (Ericsson) - bug 84144 |
| *******************************************************************************/ |
| package org.eclipse.cdt.core.parser.tests.ast2; |
| |
| import static org.eclipse.cdt.core.parser.ParserLanguage.C; |
| import static org.eclipse.cdt.core.parser.ParserLanguage.CPP; |
| |
| import java.io.IOException; |
| |
| import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; |
| import org.eclipse.cdt.core.dom.ast.ASTVisitor; |
| import org.eclipse.cdt.core.dom.ast.EScopeKind; |
| import org.eclipse.cdt.core.dom.ast.ExpansionOverlapsBoundaryException; |
| 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.IASTCaseStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTCastExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTComment; |
| import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; |
| import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression; |
| 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.IASTDoStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; |
| import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; |
| import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; |
| import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer; |
| import org.eclipse.cdt.core.dom.ast.IASTExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTExpressionList; |
| import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTFieldReference; |
| import org.eclipse.cdt.core.dom.ast.IASTFileLocation; |
| import org.eclipse.cdt.core.dom.ast.IASTForStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; |
| import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; |
| import org.eclipse.cdt.core.dom.ast.IASTIdExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTIfStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTImageLocation; |
| import org.eclipse.cdt.core.dom.ast.IASTInitializer; |
| import org.eclipse.cdt.core.dom.ast.IASTInitializerClause; |
| import org.eclipse.cdt.core.dom.ast.IASTInitializerList; |
| import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation; |
| import org.eclipse.cdt.core.dom.ast.IASTName; |
| import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; |
| import org.eclipse.cdt.core.dom.ast.IASTNode; |
| import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; |
| import org.eclipse.cdt.core.dom.ast.IASTNullStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; |
| import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; |
| import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; |
| import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion; |
| import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTProblem; |
| import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; |
| import org.eclipse.cdt.core.dom.ast.IASTProblemStatement; |
| 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.IASTSwitchStatement; |
| import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; |
| import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; |
| import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; |
| import org.eclipse.cdt.core.dom.ast.IArrayType; |
| import org.eclipse.cdt.core.dom.ast.IBasicType; |
| import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; |
| import org.eclipse.cdt.core.dom.ast.IBinding; |
| import org.eclipse.cdt.core.dom.ast.ICompositeType; |
| import org.eclipse.cdt.core.dom.ast.IEnumeration; |
| import org.eclipse.cdt.core.dom.ast.IEnumerator; |
| import org.eclipse.cdt.core.dom.ast.IField; |
| import org.eclipse.cdt.core.dom.ast.IFunction; |
| import org.eclipse.cdt.core.dom.ast.IFunctionType; |
| import org.eclipse.cdt.core.dom.ast.ILabel; |
| import org.eclipse.cdt.core.dom.ast.IMacroBinding; |
| import org.eclipse.cdt.core.dom.ast.IParameter; |
| import org.eclipse.cdt.core.dom.ast.IPointerType; |
| import org.eclipse.cdt.core.dom.ast.IProblemBinding; |
| import org.eclipse.cdt.core.dom.ast.IQualifierType; |
| import org.eclipse.cdt.core.dom.ast.IScope; |
| import org.eclipse.cdt.core.dom.ast.IType; |
| import org.eclipse.cdt.core.dom.ast.ITypedef; |
| import org.eclipse.cdt.core.dom.ast.IValue; |
| import org.eclipse.cdt.core.dom.ast.IVariable; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTPointer; |
| import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; |
| 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.cpp.ICPPClassType; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; |
| import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; |
| import org.eclipse.cdt.core.parser.IToken; |
| import org.eclipse.cdt.core.parser.ParserLanguage; |
| import org.eclipse.cdt.internal.core.dom.parser.ASTNode; |
| 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.c.ICInternalBinding; |
| import org.eclipse.cdt.internal.core.model.ASTStringUtil; |
| import org.eclipse.cdt.internal.core.parser.ParserException; |
| |
| import junit.framework.TestSuite; |
| |
| /** |
| * Test cases on the AST. |
| */ |
| public class AST2Tests extends AST2TestBase { |
| private static final int NUM_TESTS = 3; |
| private static final int RETRY_INTERMITTENT_COUNT = 5; |
| |
| public static TestSuite suite() { |
| return suite(AST2Tests.class); |
| } |
| |
| public AST2Tests() { |
| super(); |
| } |
| |
| public AST2Tests(String name) { |
| super(name); |
| } |
| |
| private void parseAndCheckBindings() throws Exception { |
| parseAndCheckBindings(false); |
| } |
| |
| private void parseAndCheckBindings(boolean useGnuExtensions) throws Exception { |
| String code= getAboveComment(); |
| parseAndCheckBindings(code, C, useGnuExtensions); |
| parseAndCheckBindings(code, CPP, useGnuExtensions); |
| } |
| |
| protected IASTTranslationUnit parseAndCheckBindings(String code) throws Exception { |
| return parseAndCheckBindings(code, C); |
| } |
| |
| public void testBug75189() throws Exception { |
| parseAndCheckBindings("struct A{};\n typedef int (*F) (struct A*);"); //$NON-NLS-1$ |
| parseAndCheckBindings("struct A{};\n typedef int (*F) (A*);", CPP); //$NON-NLS-1$ |
| } |
| |
| public void testBug75340() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings("void f(int i = 0, int * p = 0);", CPP); //$NON-NLS-1$ |
| IASTSimpleDeclaration sd = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| isParameterSignatureEqual(sd.getDeclarators()[0], "(int=0, int*=0)"); //$NON-NLS-1$ |
| } |
| |
| // int *p1; int *p2; |
| // union { |
| // struct {int a; int b;} A; |
| // struct {int a; int b;}; |
| // } MyStruct; |
| // void test (void) { |
| // p1 = &MyStruct.A.a; |
| // p2 = &MyStruct.b; |
| // MyStruct.b = 1; |
| // } |
| public void testBug78103() throws Exception { |
| parseAndCheckBindings(getAboveComment()); |
| } |
| |
| // int m(int); |
| // int (*pm)(int) = &m; |
| // int f(int); |
| // int x = f((*pm)(5)); |
| public void testBug43241() throws Exception { |
| parseAndCheckBindings(getAboveComment()); |
| } |
| |
| // int *zzz1 (char); |
| // int (*zzz2) (char); |
| // int ((*zzz3)) (char); |
| // int (*(zzz4)) (char); |
| public void testBug40768() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertNoProblemBindings(col); |
| } |
| |
| // int x; |
| // void f(int y) { |
| // int z = x + y; |
| // } |
| public void testBasicFunction() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IScope globalScope = tu.getScope(); |
| |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| |
| // int x |
| IASTSimpleDeclaration decl_x = (IASTSimpleDeclaration) declarations[0]; |
| IASTSimpleDeclSpecifier declspec_x = (IASTSimpleDeclSpecifier) decl_x.getDeclSpecifier(); |
| assertEquals(IASTSimpleDeclSpecifier.t_int, declspec_x.getType()); |
| IASTDeclarator declor_x = decl_x.getDeclarators()[0]; |
| IASTName name_x = declor_x.getName(); |
| assertEquals("x", name_x.toString()); //$NON-NLS-1$ |
| |
| // function - void f() |
| IASTFunctionDefinition funcdef_f = (IASTFunctionDefinition) declarations[1]; |
| IASTSimpleDeclSpecifier declspec_f = |
| (IASTSimpleDeclSpecifier) funcdef_f.getDeclSpecifier(); |
| assertEquals(IASTSimpleDeclSpecifier.t_void, declspec_f.getType()); |
| IASTFunctionDeclarator declor_f = funcdef_f.getDeclarator(); |
| IASTName name_f = declor_f.getName(); |
| assertEquals("f", name_f.toString()); //$NON-NLS-1$ |
| |
| // parameter - int y |
| assertTrue(declor_f instanceof IASTStandardFunctionDeclarator); |
| IASTParameterDeclaration decl_y = |
| ((IASTStandardFunctionDeclarator) declor_f).getParameters()[0]; |
| IASTSimpleDeclSpecifier declspec_y = (IASTSimpleDeclSpecifier) decl_y.getDeclSpecifier(); |
| assertEquals(IASTSimpleDeclSpecifier.t_int, declspec_y.getType()); |
| IASTDeclarator declor_y = decl_y.getDeclarator(); |
| IASTName name_y = declor_y.getName(); |
| assertEquals("y", name_y.toString()); //$NON-NLS-1$ |
| |
| // int z |
| IASTCompoundStatement body_f = (IASTCompoundStatement) funcdef_f.getBody(); |
| IASTDeclarationStatement declstmt_z = |
| (IASTDeclarationStatement) body_f.getStatements()[0]; |
| IASTSimpleDeclaration decl_z = (IASTSimpleDeclaration) declstmt_z.getDeclaration(); |
| IASTSimpleDeclSpecifier declspec_z = |
| (IASTSimpleDeclSpecifier) decl_z.getDeclSpecifier(); |
| assertEquals(IASTSimpleDeclSpecifier.t_int, declspec_z.getType()); |
| IASTDeclarator declor_z = decl_z.getDeclarators()[0]; |
| IASTName name_z = declor_z.getName(); |
| assertEquals("z", name_z.toString()); //$NON-NLS-1$ |
| |
| // = x + y |
| IASTEqualsInitializer initializer = (IASTEqualsInitializer) declor_z.getInitializer(); |
| IASTBinaryExpression init_z = (IASTBinaryExpression) initializer.getInitializerClause(); |
| assertEquals(IASTBinaryExpression.op_plus, init_z.getOperator()); |
| IASTIdExpression ref_x = (IASTIdExpression) init_z.getOperand1(); |
| IASTName name_ref_x = ref_x.getName(); |
| assertEquals("x", name_ref_x.toString()); //$NON-NLS-1$ |
| |
| IASTIdExpression ref_y = (IASTIdExpression) init_z.getOperand2(); |
| IASTName name_ref_y = ref_y.getName(); |
| assertEquals("y", name_ref_y.toString()); //$NON-NLS-1$ |
| |
| // BINDINGS |
| // resolve the binding to get the variable object |
| IVariable var_x = (IVariable) name_x.resolveBinding(); |
| assertEquals(globalScope, var_x.getScope()); |
| IFunction func_f = (IFunction) name_f.resolveBinding(); |
| assertEquals(globalScope, func_f.getScope()); |
| IParameter var_y = (IParameter) name_y.resolveBinding(); |
| assertEquals(((IASTCompoundStatement) funcdef_f.getBody()).getScope(), |
| var_y.getScope()); |
| |
| IVariable var_z = (IVariable) name_z.resolveBinding(); |
| assertEquals(((ICFunctionScope) func_f.getFunctionScope()).getBodyScope(), var_z.getScope()); |
| |
| // make sure the variable referenced is the same one we declared above |
| assertEquals(var_x, name_ref_x.resolveBinding()); |
| assertEquals(var_y, name_ref_y.resolveBinding()); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_x.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| decls = tu.getDeclarationsInAST(name_f.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_f); |
| |
| decls = tu.getDeclarationsInAST(name_y.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_y); |
| |
| decls = tu.getDeclarationsInAST(name_z.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_z); |
| |
| decls = tu.getDeclarationsInAST(name_ref_x.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| decls = tu.getDeclarationsInAST(name_ref_y.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_y); |
| |
| // // test clearBindings |
| // assertNotNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "f".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) body_f.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "z".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) body_f.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "y".toCharArray())); |
| // //$NON-NLS-1$ |
| // CVisitor.clearBindings(tu); |
| // assertNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "f".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) body_f.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "z".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) body_f.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "y".toCharArray())); |
| // //$NON-NLS-1$ |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef struct { |
| // int x; |
| // } S; |
| // |
| // void f() { |
| // S myS; |
| // myS.x = 5; |
| // } |
| public void testSimpleStruct() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTCompositeTypeSpecifier type = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier(); |
| |
| // it's a typedef |
| assertEquals(IASTDeclSpecifier.sc_typedef, type.getStorageClass()); |
| // this an anonymous struct |
| IASTName name_struct = type.getName(); |
| assertTrue(name_struct.isDeclaration()); |
| assertFalse(name_struct.isReference()); |
| assertEquals("", name_struct.toString()); //$NON-NLS-1$ |
| // member - x |
| IASTSimpleDeclaration decl_x = (IASTSimpleDeclaration) type.getMembers()[0]; |
| IASTSimpleDeclSpecifier spec_x = (IASTSimpleDeclSpecifier) decl_x.getDeclSpecifier(); |
| // it's an int |
| assertEquals(IASTSimpleDeclSpecifier.t_int, spec_x.getType()); |
| IASTDeclarator tor_x = decl_x.getDeclarators()[0]; |
| IASTName name_x = tor_x.getName(); |
| assertEquals("x", name_x.toString()); //$NON-NLS-1$ |
| |
| // declarator S |
| IASTDeclarator tor_S = decl.getDeclarators()[0]; |
| IASTName name_S = tor_S.getName(); |
| assertEquals("S", name_S.toString()); //$NON-NLS-1$ |
| |
| // function f |
| IASTFunctionDefinition def_f = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| // f's body |
| IASTCompoundStatement body_f = (IASTCompoundStatement) def_f.getBody(); |
| // the declaration statement for myS |
| IASTDeclarationStatement declstmt_myS = (IASTDeclarationStatement) body_f.getStatements()[0]; |
| // the declaration for myS |
| IASTSimpleDeclaration decl_myS = (IASTSimpleDeclaration) declstmt_myS.getDeclaration(); |
| // the type specifier for myS |
| IASTNamedTypeSpecifier type_spec_myS = (IASTNamedTypeSpecifier) decl_myS.getDeclSpecifier(); |
| // the type name for myS |
| IASTName name_type_myS = type_spec_myS.getName(); |
| // the declarator for myS |
| IASTDeclarator tor_myS = decl_myS.getDeclarators()[0]; |
| // the name for myS |
| IASTName name_myS = tor_myS.getName(); |
| // the assignment expression statement |
| IASTExpressionStatement exprstmt = (IASTExpressionStatement) body_f.getStatements()[1]; |
| // the assignment expression |
| IASTBinaryExpression assexpr = (IASTBinaryExpression) exprstmt.getExpression(); |
| // the field reference to myS.x |
| IASTFieldReference fieldref = (IASTFieldReference) assexpr.getOperand1(); |
| // the reference to myS |
| IASTIdExpression ref_myS = (IASTIdExpression) fieldref.getFieldOwner(); |
| IASTLiteralExpression lit_5 = (IASTLiteralExpression) assexpr.getOperand2(); |
| assertEquals("5", lit_5.toString()); //$NON-NLS-1$ |
| |
| // Logical Bindings In Test |
| ICompositeType type_struct = (ICompositeType) name_struct.resolveBinding(); |
| ITypedef typedef_S = (ITypedef) name_S.resolveBinding(); |
| // make sure the typedef is hooked up correctly |
| assertEquals(type_struct, typedef_S.getType()); |
| // the typedef S for myS |
| ITypedef typedef_myS = (ITypedef) name_type_myS.resolveBinding(); |
| assertEquals(typedef_S, typedef_myS); |
| // get the real type for S which is our anonymous struct |
| ICompositeType type_myS = (ICompositeType) typedef_myS.getType(); |
| assertEquals(type_myS, type_struct); |
| // the variable myS |
| IVariable var_myS = (IVariable) name_myS.resolveBinding(); |
| assertEquals(typedef_S, var_myS.getType()); |
| assertEquals(var_myS, ref_myS.getName().resolveBinding()); |
| IField field_x = (IField) name_x.resolveBinding(); |
| assertEquals(field_x, fieldref.getFieldName().resolveBinding()); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_struct.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_struct); |
| |
| decls = tu.getDeclarationsInAST(name_x.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| decls = tu.getDeclarationsInAST(def_f.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], def_f.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(name_S.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_S); |
| |
| decls = tu.getDeclarationsInAST(name_myS.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_myS); |
| |
| decls = tu.getDeclarationsInAST(ref_myS.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_myS); |
| |
| decls = tu.getDeclarationsInAST(fieldref.getFieldName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testCExpressions() throws ParserException { |
| validateSimpleUnaryExpressionC("++x", IASTUnaryExpression.op_prefixIncr); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("--x", IASTUnaryExpression.op_prefixDecr); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("+x", IASTUnaryExpression.op_plus); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("-x", IASTUnaryExpression.op_minus); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("!x", IASTUnaryExpression.op_not); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("~x", IASTUnaryExpression.op_tilde); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("*x", IASTUnaryExpression.op_star); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC("&x", IASTUnaryExpression.op_amper); //$NON-NLS-1$ |
| validateSimpleUnaryExpressionC( |
| "sizeof x", IASTUnaryExpression.op_sizeof); //$NON-NLS-1$ |
| validateSimpleTypeIdExpressionC( |
| "sizeof(int)", IASTTypeIdExpression.op_sizeof); //$NON-NLS-1$ |
| validateSimpleUnaryTypeIdExpression( |
| "(int)x", IASTCastExpression.op_cast); //$NON-NLS-1$ |
| validateSimplePostfixInitializerExpressionC("(int) { 5 }"); //$NON-NLS-1$ |
| validateSimplePostfixInitializerExpressionC("(int) { 5, }"); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x=y", IASTBinaryExpression.op_assign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x*=y", IASTBinaryExpression.op_multiplyAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x/=y", IASTBinaryExpression.op_divideAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x%=y", IASTBinaryExpression.op_moduloAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x+=y", IASTBinaryExpression.op_plusAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x-=y", IASTBinaryExpression.op_minusAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x<<=y", IASTBinaryExpression.op_shiftLeftAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x>>=y", IASTBinaryExpression.op_shiftRightAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x&=y", IASTBinaryExpression.op_binaryAndAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x^=y", IASTBinaryExpression.op_binaryXorAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x|=y", IASTBinaryExpression.op_binaryOrAssign); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x-y", IASTBinaryExpression.op_minus); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x+y", IASTBinaryExpression.op_plus); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x/y", IASTBinaryExpression.op_divide); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x*y", IASTBinaryExpression.op_multiply); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x%y", IASTBinaryExpression.op_modulo); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x<<y", IASTBinaryExpression.op_shiftLeft); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x>>y", IASTBinaryExpression.op_shiftRight); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x<y", IASTBinaryExpression.op_lessThan); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x>y", IASTBinaryExpression.op_greaterThan); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x<=y", IASTBinaryExpression.op_lessEqual); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x>=y", IASTBinaryExpression.op_greaterEqual); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x==y", IASTBinaryExpression.op_equals); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x!=y", IASTBinaryExpression.op_notequals); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x&y", IASTBinaryExpression.op_binaryAnd); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x^y", IASTBinaryExpression.op_binaryXor); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC("x|y", IASTBinaryExpression.op_binaryOr); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x&&y", IASTBinaryExpression.op_logicalAnd); //$NON-NLS-1$ |
| validateSimpleBinaryExpressionC( |
| "x||y", IASTBinaryExpression.op_logicalOr); //$NON-NLS-1$ |
| validateConditionalExpressionC("x ? y : x"); //$NON-NLS-1$ |
| } |
| |
| public void testMultipleDeclarators() throws Exception { |
| IASTTranslationUnit tu = parse("int r, s;", C); //$NON-NLS-1$ |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTDeclarator[] declarators = decl.getDeclarators(); |
| assertEquals(2, declarators.length); |
| |
| IASTDeclarator dtor1 = declarators[0]; |
| IASTDeclarator dtor2 = declarators[1]; |
| |
| IASTName name1 = dtor1.getName(); |
| IASTName name2 = dtor2.getName(); |
| |
| assertEquals(name1.resolveBinding().getName(), "r"); //$NON-NLS-1$ |
| assertEquals(name2.resolveBinding().getName(), "s"); //$NON-NLS-1$ |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name1); |
| |
| decls = tu.getDeclarationsInAST(name2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name2); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testStructureTagScoping_1() throws Exception { |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("struct A; \n"); //$NON-NLS-1$ |
| buffer.append("void f() { \n"); //$NON-NLS-1$ |
| buffer.append(" struct A; \n"); //$NON-NLS-1$ |
| buffer.append(" struct A * a; \n"); //$NON-NLS-1$ |
| buffer.append("} \n"); //$NON-NLS-1$ |
| |
| IASTTranslationUnit tu = parse(buffer.toString(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // struct A; |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTElaboratedTypeSpecifier compTypeSpec = (IASTElaboratedTypeSpecifier) decl1.getDeclSpecifier(); |
| assertEquals(0, decl1.getDeclarators().length); |
| IASTName nameA1 = compTypeSpec.getName(); |
| |
| // void f() { |
| IASTFunctionDefinition fndef = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTCompoundStatement compoundStatement = (IASTCompoundStatement) fndef.getBody(); |
| assertEquals(2, compoundStatement.getStatements().length); |
| |
| // struct A; |
| IASTDeclarationStatement declStatement = (IASTDeclarationStatement) compoundStatement.getStatements()[0]; |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) declStatement.getDeclaration(); |
| compTypeSpec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier(); |
| assertEquals(0, decl2.getDeclarators().length); |
| IASTName nameA2 = compTypeSpec.getName(); |
| |
| // struct A * a; |
| declStatement = (IASTDeclarationStatement) compoundStatement.getStatements()[1]; |
| IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) declStatement.getDeclaration(); |
| compTypeSpec = (IASTElaboratedTypeSpecifier) decl3.getDeclSpecifier(); |
| IASTName nameA3 = compTypeSpec.getName(); |
| IASTDeclarator dtor = decl3.getDeclarators()[0]; |
| IASTName namea = dtor.getName(); |
| assertEquals(1, dtor.getPointerOperators().length); |
| assertTrue(dtor.getPointerOperators()[0] instanceof ICASTPointer); |
| |
| // bindings |
| ICompositeType str1 = (ICompositeType) nameA1.resolveBinding(); |
| ICompositeType str2 = (ICompositeType) nameA2.resolveBinding(); |
| IVariable var = (IVariable) namea.resolveBinding(); |
| IType str3pointer = var.getType(); |
| assertTrue(str3pointer instanceof IPointerType); |
| ICompositeType str3 = (ICompositeType) ((IPointerType) str3pointer).getType(); |
| ICompositeType str4 = (ICompositeType) nameA3.resolveBinding(); |
| assertNotNull(str1); |
| assertNotNull(str2); |
| assertNotSame(str1, str2); |
| assertSame(str2, str3); |
| assertSame(str3, str4); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(nameA1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], nameA1); |
| |
| decls = tu.getDeclarationsInAST(fndef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fndef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(nameA2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], nameA2); |
| |
| decls = tu.getDeclarationsInAST(nameA3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], nameA2); |
| |
| decls = tu.getDeclarationsInAST(namea.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], namea); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testStructureTagScoping_2() throws Exception { |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("struct A; \n"); //$NON-NLS-1$ |
| buffer.append("void f() { \n"); //$NON-NLS-1$ |
| buffer.append(" struct A * a; \n"); //$NON-NLS-1$ |
| buffer.append("} \r\n"); //$NON-NLS-1$ |
| |
| IASTTranslationUnit tu = parse(buffer.toString(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // struct A; |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTElaboratedTypeSpecifier compTypeSpec = (IASTElaboratedTypeSpecifier) decl1.getDeclSpecifier(); |
| assertEquals(0, decl1.getDeclarators().length); |
| IASTName nameA1 = compTypeSpec.getName(); |
| |
| // void f() { |
| IASTFunctionDefinition fndef = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTCompoundStatement compoundStatement = (IASTCompoundStatement) fndef.getBody(); |
| assertEquals(1, compoundStatement.getStatements().length); |
| |
| // struct A * a; |
| IASTDeclarationStatement declStatement = (IASTDeclarationStatement) compoundStatement.getStatements()[0]; |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) declStatement.getDeclaration(); |
| compTypeSpec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier(); |
| IASTName nameA2 = compTypeSpec.getName(); |
| IASTDeclarator dtor = decl2.getDeclarators()[0]; |
| IASTName namea = dtor.getName(); |
| assertEquals(1, dtor.getPointerOperators().length); |
| assertTrue(dtor.getPointerOperators()[0] instanceof ICASTPointer); |
| |
| // bindings |
| ICompositeType str1 = (ICompositeType) nameA1.resolveBinding(); |
| ICompositeType str2 = (ICompositeType) nameA2.resolveBinding(); |
| IVariable var = (IVariable) namea.resolveBinding(); |
| IPointerType str3pointer = (IPointerType) var.getType(); |
| ICompositeType str3 = (ICompositeType) str3pointer.getType(); |
| assertNotNull(str1); |
| assertSame(str1, str2); |
| assertSame(str2, str3); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(nameA1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], nameA1); |
| |
| decls = tu.getDeclarationsInAST(fndef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fndef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(nameA2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], nameA1); |
| |
| decls = tu.getDeclarationsInAST(namea.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], namea); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // #define F(a) a |
| // #define _MACRO "macro" |
| // #define MACRO _MACRO |
| // void f(const char* s); |
| // void test() { |
| // F(f("aaa"MACRO)); |
| // } |
| public void testStringConcatenationWithMacro() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| BindingAssertionHelper bh = getAssertionHelper(lang); |
| IASTName name = bh.findName("f(\"", 1); |
| assertNotNull(name); |
| IASTFunctionCallExpression call = (IASTFunctionCallExpression) name.getParent().getParent(); |
| IASTLiteralExpression arg = (IASTLiteralExpression) call.getArguments()[0]; |
| assertEquals("\"aaamacro\"", arg.toString()); |
| } |
| } |
| |
| public void testStructureDef() throws Exception { |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("struct A; \r\n"); //$NON-NLS-1$ |
| buffer.append("struct A * a; \n"); //$NON-NLS-1$ |
| buffer.append("struct A { int i; }; \n"); //$NON-NLS-1$ |
| buffer.append("void f() { \n"); //$NON-NLS-1$ |
| buffer.append(" a->i; \n"); //$NON-NLS-1$ |
| buffer.append("} \n"); //$NON-NLS-1$ |
| |
| IASTTranslationUnit tu = parse(buffer.toString(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // struct A; |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTElaboratedTypeSpecifier elabTypeSpec = (IASTElaboratedTypeSpecifier) decl1.getDeclSpecifier(); |
| assertEquals(0, decl1.getDeclarators().length); |
| IASTName name_A1 = elabTypeSpec.getName(); |
| |
| // struct A * a; |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| elabTypeSpec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier(); |
| IASTName name_A2 = elabTypeSpec.getName(); |
| IASTDeclarator dtor = decl2.getDeclarators()[0]; |
| IASTName name_a = dtor.getName(); |
| assertEquals(1, dtor.getPointerOperators().length); |
| assertTrue(dtor.getPointerOperators()[0] instanceof ICASTPointer); |
| |
| // struct A { |
| IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| ICASTCompositeTypeSpecifier compTypeSpec = (ICASTCompositeTypeSpecifier) decl3.getDeclSpecifier(); |
| IASTName name_Adef = compTypeSpec.getName(); |
| |
| // int i; |
| IASTSimpleDeclaration decl4 = (IASTSimpleDeclaration) compTypeSpec.getMembers()[0]; |
| dtor = decl4.getDeclarators()[0]; |
| IASTName name_i = dtor.getName(); |
| |
| // void f() { |
| IASTFunctionDefinition fndef = (IASTFunctionDefinition) tu.getDeclarations()[3]; |
| IASTCompoundStatement compoundStatement = (IASTCompoundStatement) fndef.getBody(); |
| assertEquals(1, compoundStatement.getStatements().length); |
| |
| // a->i; |
| IASTExpressionStatement exprstmt = (IASTExpressionStatement) compoundStatement.getStatements()[0]; |
| IASTFieldReference fieldref = (IASTFieldReference) exprstmt.getExpression(); |
| IASTIdExpression id_a = (IASTIdExpression) fieldref.getFieldOwner(); |
| IASTName name_aref = id_a.getName(); |
| IASTName name_iref = fieldref.getFieldName(); |
| |
| // bindings |
| IVariable var_a1 = (IVariable) name_aref.resolveBinding(); |
| IVariable var_i1 = (IVariable) name_iref.resolveBinding(); |
| IPointerType structA_1pointer = (IPointerType) var_a1.getType(); |
| ICompositeType structA_1 = (ICompositeType) structA_1pointer.getType(); |
| ICompositeType structA_2 = (ICompositeType) name_A1.resolveBinding(); |
| ICompositeType structA_3 = (ICompositeType) name_A2.resolveBinding(); |
| ICompositeType structA_4 = (ICompositeType) name_Adef.resolveBinding(); |
| |
| IVariable var_a2 = (IVariable) name_a.resolveBinding(); |
| IVariable var_i2 = (IVariable) name_i.resolveBinding(); |
| |
| assertSame(var_a1, var_a2); |
| assertSame(var_i1, var_i2); |
| assertSame(structA_1, structA_2); |
| assertSame(structA_2, structA_3); |
| assertSame(structA_3, structA_4); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_A1.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_A1); |
| assertEquals(decls[1], name_Adef); |
| |
| decls = tu.getDeclarationsInAST(name_A2.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_A1); |
| assertEquals(decls[1], name_Adef); |
| |
| decls = tu.getDeclarationsInAST(name_a.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a); |
| |
| decls = tu.getDeclarationsInAST(name_Adef.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_A1); |
| assertEquals(decls[1], name_Adef); |
| |
| decls = tu.getDeclarationsInAST(name_i.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| decls = tu.getDeclarationsInAST(fndef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fndef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(name_aref.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a); |
| |
| decls = tu.getDeclarationsInAST(name_iref.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // struct x {}; |
| // void f(int x) { |
| // struct x i; |
| // } |
| public void testStructureNamespace() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration declaration1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTCompositeTypeSpecifier typeSpec = (IASTCompositeTypeSpecifier) declaration1.getDeclSpecifier(); |
| IASTName x_1 = typeSpec.getName(); |
| |
| IASTFunctionDefinition fdef = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| assertTrue(fdef.getDeclarator() instanceof IASTStandardFunctionDeclarator); |
| IASTParameterDeclaration param = ((IASTStandardFunctionDeclarator) fdef.getDeclarator()).getParameters()[0]; |
| IASTName x_2 = param.getDeclarator().getName(); |
| |
| IASTCompoundStatement compound = (IASTCompoundStatement) fdef.getBody(); |
| IASTDeclarationStatement declStatement = (IASTDeclarationStatement) compound.getStatements()[0]; |
| IASTSimpleDeclaration declaration2 = (IASTSimpleDeclaration) declStatement.getDeclaration(); |
| IASTElaboratedTypeSpecifier elab = (IASTElaboratedTypeSpecifier) declaration2.getDeclSpecifier(); |
| IASTName x_3 = elab.getName(); |
| |
| ICompositeType x1 = (ICompositeType) x_1.resolveBinding(); |
| IVariable x2 = (IVariable) x_2.resolveBinding(); |
| ICompositeType x3 = (ICompositeType) x_3.resolveBinding(); |
| |
| assertNotNull(x1); |
| assertNotNull(x2); |
| assertSame(x1, x3); |
| assertNotSame(x2, x3); |
| |
| IASTDeclarator decl_i = declaration2.getDeclarators()[0]; |
| decl_i.getName().resolveBinding(); // add i's binding to the scope |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(x_1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], x_1); |
| |
| decls = tu.getDeclarationsInAST(fdef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fdef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(x_2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], x_2); |
| |
| decls = tu.getDeclarationsInAST(x_3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], x_1); |
| |
| decls = tu.getDeclarationsInAST(declaration2.getDeclarators()[0].getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], declaration2.getDeclarators()[0].getName()); |
| |
| // assertNotNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_TAG, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "f".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) compound.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNotNull(((ICScope) compound.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "i".toCharArray())); |
| // //$NON-NLS-1$ |
| // CVisitor.clearBindings(tu); |
| // assertNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_TAG, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) tu.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "f".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) compound.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "x".toCharArray())); |
| // //$NON-NLS-1$ |
| // assertNull(((ICScope) compound.getScope()).getBinding( |
| // ICScope.NAMESPACE_TYPE_OTHER, "i".toCharArray())); |
| // //$NON-NLS-1$ |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f(int a); |
| // void f(int b) { |
| // b; |
| // } |
| public void testFunctionParameters() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parse(code, C); |
| |
| assertTrue(tu.isFrozen()); |
| // void f( |
| IASTSimpleDeclaration f_decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTStandardFunctionDeclarator dtor = (IASTStandardFunctionDeclarator) f_decl.getDeclarators()[0]; |
| IASTName f_name1 = dtor.getName(); |
| // int a); |
| IASTParameterDeclaration param1 = dtor.getParameters()[0]; |
| IASTDeclarator paramDtor = param1.getDeclarator(); |
| IASTName name_param1 = paramDtor.getName(); |
| |
| // void f( |
| IASTFunctionDefinition f_defn = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| assertTrue(f_defn.getDeclarator() instanceof IASTStandardFunctionDeclarator); |
| dtor = (IASTStandardFunctionDeclarator) f_defn.getDeclarator(); |
| IASTName f_name2 = dtor.getName(); |
| // int b); |
| IASTParameterDeclaration param2 = dtor.getParameters()[0]; |
| paramDtor = param2.getDeclarator(); |
| IASTName name_param2 = paramDtor.getName(); |
| |
| // b; |
| IASTCompoundStatement compound = (IASTCompoundStatement) f_defn.getBody(); |
| IASTExpressionStatement expStatement = (IASTExpressionStatement) compound.getStatements()[0]; |
| IASTIdExpression idexp = (IASTIdExpression) expStatement.getExpression(); |
| IASTName name_param3 = idexp.getName(); |
| |
| // bindings |
| IParameter param_1 = (IParameter) name_param3.resolveBinding(); |
| IParameter param_2 = (IParameter) name_param2.resolveBinding(); |
| IParameter param_3 = (IParameter) name_param1.resolveBinding(); |
| IFunction f_1 = (IFunction) f_name1.resolveBinding(); |
| IFunction f_2 = (IFunction) f_name2.resolveBinding(); |
| |
| assertNotNull(param_1); |
| assertNotNull(f_1); |
| assertSame(param_1, param_2); |
| assertSame(param_2, param_3); |
| assertSame(f_1, f_2); |
| |
| tu = parse(code, C); |
| assertTrue(tu.isFrozen()); |
| // void f( |
| f_decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| dtor = (IASTStandardFunctionDeclarator) f_decl.getDeclarators()[0]; |
| f_name1 = dtor.getName(); |
| // int a); |
| param1 = dtor.getParameters()[0]; |
| paramDtor = param1.getDeclarator(); |
| name_param1 = paramDtor.getName(); |
| |
| // void f( |
| f_defn = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| dtor = (IASTStandardFunctionDeclarator) f_defn.getDeclarator(); |
| f_name2 = dtor.getName(); |
| // int b); |
| param2 = dtor.getParameters()[0]; |
| paramDtor = param2.getDeclarator(); |
| name_param2 = paramDtor.getName(); |
| |
| // b; |
| compound = (IASTCompoundStatement) f_defn.getBody(); |
| expStatement = (IASTExpressionStatement) compound.getStatements()[0]; |
| idexp = (IASTIdExpression) expStatement.getExpression(); |
| name_param3 = idexp.getName(); |
| |
| // bindings |
| param_1 = (IParameter) name_param1.resolveBinding(); |
| param_2 = (IParameter) name_param3.resolveBinding(); |
| param_3 = (IParameter) name_param2.resolveBinding(); |
| f_1 = (IFunction) f_name2.resolveBinding(); |
| f_2 = (IFunction) f_name1.resolveBinding(); |
| assertNotNull(param_1); |
| assertNotNull(f_1); |
| assertSame(param_1, param_2); |
| assertSame(param_2, param_3); |
| assertSame(f_1, f_2); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(f_name1.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], f_name1); |
| assertEquals(decls[1], f_name2); |
| |
| decls = tu.getDeclarationsInAST(name_param1.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_param1); |
| assertEquals(decls[1], name_param2); |
| |
| decls = tu.getDeclarationsInAST(f_name2.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], f_name1); |
| assertEquals(decls[1], f_name2); |
| |
| decls = tu.getDeclarationsInAST(name_param2.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_param1); |
| assertEquals(decls[1], name_param2); |
| |
| tu = validateCopy(tu); |
| } |
| |
| // void f(int a, int b) { } |
| public void testSimpleFunction() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTFunctionDefinition fDef = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| assertTrue(fDef.getDeclarator() instanceof IASTStandardFunctionDeclarator); |
| IASTStandardFunctionDeclarator fDtor = (IASTStandardFunctionDeclarator) fDef.getDeclarator(); |
| IASTName fName = fDtor.getName(); |
| |
| IASTParameterDeclaration a = fDtor.getParameters()[0]; |
| IASTName name_a = a.getDeclarator().getName(); |
| |
| IASTParameterDeclaration b = fDtor.getParameters()[1]; |
| IASTName name_b = b.getDeclarator().getName(); |
| |
| IFunction function = (IFunction) fName.resolveBinding(); |
| IParameter param_a = (IParameter) name_a.resolveBinding(); |
| IParameter param_b = (IParameter) name_b.resolveBinding(); |
| |
| assertEquals("f", function.getName()); //$NON-NLS-1$ |
| assertEquals("a", param_a.getName()); //$NON-NLS-1$ |
| assertEquals("b", param_b.getName()); //$NON-NLS-1$ |
| |
| IParameter[] params = function.getParameters(); |
| assertEquals(2, params.length); |
| assertSame(params[0], param_a); |
| assertSame(params[1], param_b); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(fName.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fName); |
| |
| decls = tu.getDeclarationsInAST(name_a.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a); |
| |
| decls = tu.getDeclarationsInAST(name_b.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_b); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f(); |
| // void g() { |
| // f(); |
| // } |
| // void f() { } |
| public void testSimpleFunctionCall() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // void f(); |
| IASTSimpleDeclaration fdecl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTStandardFunctionDeclarator fdtor = (IASTStandardFunctionDeclarator) fdecl.getDeclarators()[0]; |
| IASTName name_f = fdtor.getName(); |
| |
| // void g() { |
| IASTFunctionDefinition gdef = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| |
| // f(); |
| IASTCompoundStatement compound = (IASTCompoundStatement) gdef.getBody(); |
| IASTExpressionStatement expStatement = (IASTExpressionStatement) compound.getStatements()[0]; |
| IASTFunctionCallExpression fcall = (IASTFunctionCallExpression) expStatement.getExpression(); |
| IASTIdExpression fcall_id = (IASTIdExpression) fcall.getFunctionNameExpression(); |
| IASTName name_fcall = fcall_id.getName(); |
| assertEquals(0, fcall.getArguments().length); |
| |
| // void f() {} |
| IASTFunctionDefinition fdef = (IASTFunctionDefinition) tu.getDeclarations()[2]; |
| assertTrue(fdef.getDeclarator() instanceof IASTStandardFunctionDeclarator); |
| fdtor = (IASTStandardFunctionDeclarator) fdef.getDeclarator(); |
| IASTName name_fdef = fdtor.getName(); |
| |
| // bindings |
| IFunction function_1 = (IFunction) name_fcall.resolveBinding(); |
| IFunction function_2 = (IFunction) name_f.resolveBinding(); |
| IFunction function_3 = (IFunction) name_fdef.resolveBinding(); |
| |
| assertNotNull(function_1); |
| assertSame(function_1, function_2); |
| assertSame(function_2, function_3); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_f.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_f); |
| assertEquals(decls[1], name_fdef); |
| |
| decls = tu.getDeclarationsInAST(gdef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], gdef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(name_fcall.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_f); |
| assertEquals(decls[1], name_fdef); |
| |
| decls = tu.getDeclarationsInAST(name_fdef.resolveBinding()); |
| assertEquals(decls.length, 2); |
| assertEquals(decls[0], name_f); |
| assertEquals(decls[1], name_fdef); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f() { |
| // for (int i = 0; i < 5; i++) { |
| // i; |
| // } |
| // } |
| public void testForLoop() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // void f() { |
| IASTFunctionDefinition fdef = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IASTCompoundStatement compound = (IASTCompoundStatement) fdef.getBody(); |
| |
| // for( |
| IASTForStatement for_stmt = (IASTForStatement) compound.getStatements()[0]; |
| // int i = 0; |
| |
| IASTDeclarationStatement declStatement = |
| (IASTDeclarationStatement) for_stmt.getInitializerStatement(); |
| IASTSimpleDeclaration initDecl = (IASTSimpleDeclaration) declStatement.getDeclaration(); |
| IASTDeclarator dtor = initDecl.getDeclarators()[0]; |
| IASTName name_i = dtor.getName(); |
| // i < 5; |
| IASTBinaryExpression exp = (IASTBinaryExpression) for_stmt.getConditionExpression(); |
| IASTIdExpression id_i = (IASTIdExpression) exp.getOperand1(); |
| IASTName name_i2 = id_i.getName(); |
| IASTLiteralExpression lit_5 = (IASTLiteralExpression) exp.getOperand2(); |
| assertEquals(IASTLiteralExpression.lk_integer_constant, lit_5.getKind()); |
| // i++) { |
| IASTUnaryExpression un = (IASTUnaryExpression) for_stmt.getIterationExpression(); |
| IASTIdExpression id_i2 = (IASTIdExpression) un.getOperand(); |
| IASTName name_i3 = id_i2.getName(); |
| assertEquals(IASTUnaryExpression.op_postFixIncr, un.getOperator()); |
| |
| // i; |
| compound = (IASTCompoundStatement) for_stmt.getBody(); |
| IASTExpressionStatement exprSt = (IASTExpressionStatement) compound.getStatements()[0]; |
| IASTIdExpression id_i3 = (IASTIdExpression) exprSt.getExpression(); |
| IASTName name_i4 = id_i3.getName(); |
| |
| // bindings |
| IVariable var_1 = (IVariable) name_i4.resolveBinding(); |
| IVariable var_2 = (IVariable) name_i.resolveBinding(); |
| IVariable var_3 = (IVariable) name_i2.resolveBinding(); |
| IVariable var_4 = (IVariable) name_i3.resolveBinding(); |
| |
| assertSame(var_1, var_2); |
| assertSame(var_2, var_3); |
| assertSame(var_3, var_4); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(fdef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fdef.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(name_i.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| decls = tu.getDeclarationsInAST(name_i2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| decls = tu.getDeclarationsInAST(name_i3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| decls = tu.getDeclarationsInAST(name_i4.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // struct A { int x; }; |
| // void f() { |
| // ((struct A *) 1)->x; |
| // } |
| public void testExpressionFieldReference() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTCompositeTypeSpecifier compType = (IASTCompositeTypeSpecifier) simpleDecl.getDeclSpecifier(); |
| IASTSimpleDeclaration decl_x = (IASTSimpleDeclaration) compType.getMembers()[0]; |
| IASTName name_x1 = decl_x.getDeclarators()[0].getName(); |
| IASTFunctionDefinition fdef = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTCompoundStatement body = (IASTCompoundStatement) fdef.getBody(); |
| IASTExpressionStatement expStatement = (IASTExpressionStatement) body.getStatements()[0]; |
| IASTFieldReference fieldRef = (IASTFieldReference) expStatement.getExpression(); |
| IASTName name_x2 = fieldRef.getFieldName(); |
| |
| IField x1 = (IField) name_x1.resolveBinding(); |
| IField x2 = (IField) name_x2.resolveBinding(); |
| |
| assertNotNull(x1); |
| assertSame(x1, x2); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(compType.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], compType.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_x1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x1); |
| |
| decls = tu.getDeclarationsInAST(fdef.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fdef.getDeclarator().getName()); |
| |
| fieldRef = (IASTFieldReference) expStatement.getExpression(); |
| IASTCastExpression castExpression = |
| (IASTCastExpression) ((IASTUnaryExpression) fieldRef.getFieldOwner()).getOperand(); |
| IASTElaboratedTypeSpecifier elaboratedTypeSpecifier = ((IASTElaboratedTypeSpecifier) castExpression.getTypeId().getDeclSpecifier()); |
| decls = tu.getDeclarationsInAST(elaboratedTypeSpecifier.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], compType.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_x2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x1); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f() { |
| // while (1) { |
| // if (1) |
| // goto end; |
| // } |
| // end: ; |
| // } |
| public void testLabels() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector collector = new NameCollector(); |
| tu.accept(collector); |
| |
| assertEquals(collector.size(), 3); |
| IFunction function = (IFunction) collector.getName(0).resolveBinding(); |
| ILabel label_1 = (ILabel) collector.getName(1).resolveBinding(); |
| ILabel label_2 = (ILabel) collector.getName(2).resolveBinding(); |
| assertNotNull(function); |
| assertNotNull(label_1); |
| assertEquals(label_1, label_2); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(collector.getName(0).resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], collector.getName(0)); |
| |
| decls = tu.getDeclarationsInAST(collector.getName(1).resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], collector.getName(2)); |
| |
| decls = tu.getDeclarationsInAST(collector.getName(2).resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], collector.getName(2)); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef struct { } X; |
| // int f(X x); |
| public void testAnonStruct() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IASTName name_X1 = decl1.getDeclarators()[0].getName(); |
| IASTName name_f = decl2.getDeclarators()[0].getName(); |
| IASTStandardFunctionDeclarator functionDecl = |
| (IASTStandardFunctionDeclarator) decl2.getDeclarators()[0]; |
| IASTName name_X2 = |
| ((IASTNamedTypeSpecifier) functionDecl.getParameters()[0].getDeclSpecifier()).getName(); |
| IASTName name_x = functionDecl.getParameters()[0].getDeclarator().getName(); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(name_X1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_X1); |
| |
| decls = tu.getDeclarationsInAST(name_f.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_f); |
| |
| decls = tu.getDeclarationsInAST(name_X2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_X1); |
| |
| decls = tu.getDeclarationsInAST(name_x.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testLongLong() throws ParserException { |
| IASTTranslationUnit tu = parse("long long x;\n", C); //$NON-NLS-1$ |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTName name_x = decl1.getDeclarators()[0].getName(); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(name_x.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| } |
| |
| // enum hue { red, blue, green }; |
| // enum hue col, *cp; |
| // void f() { |
| // col = blue; |
| // cp = &col; |
| // if (*cp != red) |
| // return; |
| // } |
| public void testEnumerations() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| assertEquals(decl1.getDeclarators().length, 0); |
| ICASTEnumerationSpecifier enumSpec = (ICASTEnumerationSpecifier) decl1.getDeclSpecifier(); |
| IASTEnumerator e1 = enumSpec.getEnumerators()[0]; |
| IASTEnumerator e2 = enumSpec.getEnumerators()[1]; |
| IASTEnumerator e3 = enumSpec.getEnumerators()[2]; |
| IASTName name_hue = enumSpec.getName(); |
| |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IASTDeclarator dtor = decl2.getDeclarators()[0]; |
| IASTName name_col = dtor.getName(); |
| dtor = decl2.getDeclarators()[1]; |
| IASTName name_cp = dtor.getName(); |
| IASTElaboratedTypeSpecifier spec = (IASTElaboratedTypeSpecifier) decl2.getDeclSpecifier(); |
| assertEquals(spec.getKind(), IASTElaboratedTypeSpecifier.k_enum); |
| IASTName name_hue2 = spec.getName(); |
| |
| IASTFunctionDefinition fn = (IASTFunctionDefinition) tu.getDeclarations()[2]; |
| IASTCompoundStatement compound = (IASTCompoundStatement) fn.getBody(); |
| IASTExpressionStatement expStatement1 = (IASTExpressionStatement) compound.getStatements()[0]; |
| IASTBinaryExpression exp = (IASTBinaryExpression) expStatement1.getExpression(); |
| assertEquals(exp.getOperator(), IASTBinaryExpression.op_assign); |
| IASTIdExpression id1 = (IASTIdExpression) exp.getOperand1(); |
| IASTIdExpression id2 = (IASTIdExpression) exp.getOperand2(); |
| IASTName r_col = id1.getName(); |
| IASTName r_blue = id2.getName(); |
| |
| IASTExpressionStatement expStatement2 = (IASTExpressionStatement) compound.getStatements()[1]; |
| exp = (IASTBinaryExpression) expStatement2.getExpression(); |
| assertEquals(exp.getOperator(), IASTBinaryExpression.op_assign); |
| id1 = (IASTIdExpression) exp.getOperand1(); |
| IASTUnaryExpression ue = (IASTUnaryExpression) exp.getOperand2(); |
| id2 = (IASTIdExpression) ue.getOperand(); |
| IASTName r_cp = id1.getName(); |
| IASTName r_col2 = id2.getName(); |
| |
| IASTIfStatement ifStatement = (IASTIfStatement) compound.getStatements()[2]; |
| exp = (IASTBinaryExpression) ifStatement.getConditionExpression(); |
| ue = (IASTUnaryExpression) exp.getOperand1(); |
| id1 = (IASTIdExpression) ue.getOperand(); |
| id2 = (IASTIdExpression) exp.getOperand2(); |
| |
| IASTName r_cp2 = id1.getName(); |
| IASTName r_red = id2.getName(); |
| |
| IEnumeration hue = (IEnumeration) name_hue.resolveBinding(); |
| IEnumerator red = (IEnumerator) e1.getName().resolveBinding(); |
| IEnumerator blue = (IEnumerator) e2.getName().resolveBinding(); |
| IEnumerator green = (IEnumerator) e3.getName().resolveBinding(); |
| IVariable col = (IVariable) name_col.resolveBinding(); |
| IVariable cp = (IVariable) name_cp.resolveBinding(); |
| IEnumeration hue_2 = (IEnumeration) name_hue2.resolveBinding(); |
| IVariable col2 = (IVariable) r_col.resolveBinding(); |
| IEnumerator blue2 = (IEnumerator) r_blue.resolveBinding(); |
| IVariable cp2 = (IVariable) r_cp.resolveBinding(); |
| IVariable col3 = (IVariable) r_col2.resolveBinding(); |
| IVariable cp3 = (IVariable) r_cp2.resolveBinding(); |
| IEnumerator red2 = (IEnumerator) r_red.resolveBinding(); |
| |
| assertNotNull(hue); |
| assertSame(hue, hue_2); |
| assertNotNull(red); |
| assertNotNull(green); |
| assertNotNull(blue); |
| assertNotNull(col); |
| assertNotNull(cp); |
| assertSame(col, col2); |
| assertSame(blue, blue2); |
| assertSame(cp, cp2); |
| assertSame(col, col3); |
| assertSame(cp, cp3); |
| assertSame(red, red2); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_hue.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_hue); |
| |
| decls = tu.getDeclarationsInAST(e1.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], e1.getName()); |
| |
| decls = tu.getDeclarationsInAST(e2.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], e2.getName()); |
| |
| decls = tu.getDeclarationsInAST(e3.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], e3.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_hue2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_hue); |
| |
| decls = tu.getDeclarationsInAST(name_col.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_col); |
| |
| decls = tu.getDeclarationsInAST(name_cp.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_cp); |
| |
| decls = tu.getDeclarationsInAST(fn.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fn.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(r_col.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_col); |
| |
| decls = tu.getDeclarationsInAST(r_blue.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], e2.getName()); |
| |
| decls = tu.getDeclarationsInAST(r_cp.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_cp); |
| |
| decls = tu.getDeclarationsInAST(r_col2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_col); |
| |
| decls = tu.getDeclarationsInAST(r_cp2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_cp); |
| |
| decls = tu.getDeclarationsInAST(r_red.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], e1.getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testPointerToFunction() throws Exception { |
| IASTTranslationUnit tu = parse("int (*pfi)();", C); //$NON-NLS-1$ |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| assertEquals(tu.getDeclarations().length, 1); |
| IASTSimpleDeclaration d = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| assertEquals(d.getDeclarators().length, 1); |
| IASTStandardFunctionDeclarator f = (IASTStandardFunctionDeclarator) d.getDeclarators()[0]; |
| assertEquals(f.getName().toString(), ""); //$NON-NLS-1$ |
| assertNotNull(f.getNestedDeclarator()); |
| assertEquals(f.getNestedDeclarator().getName().toString(), "pfi"); //$NON-NLS-1$ |
| assertTrue(f.getPointerOperators().length == 0); |
| assertFalse(f.getNestedDeclarator().getPointerOperators().length == 0); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(f.getNestedDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], f.getNestedDeclarator().getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // int a; |
| // char * b; |
| // const int c; |
| // const char * const d; |
| // const char ** e; |
| // const char * const * const volatile ** const * f; |
| public void testBasicTypes() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IVariable a = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IVariable b = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IVariable c = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| IVariable d = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[4]; |
| IVariable e = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[5]; |
| IVariable f = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| |
| IType t_a_1 = a.getType(); |
| assertTrue(t_a_1 instanceof IBasicType); |
| assertFalse(((IBasicType) t_a_1).isLong()); |
| assertFalse(((IBasicType) t_a_1).isShort()); |
| assertFalse(((IBasicType) t_a_1).isSigned()); |
| assertFalse(((IBasicType) t_a_1).isUnsigned()); |
| assertEquals(((IBasicType) t_a_1).getType(), IBasicType.t_int); |
| |
| IType t_b_1 = b.getType(); |
| assertTrue(t_b_1 instanceof IPointerType); |
| IType t_b_2 = ((IPointerType) t_b_1).getType(); |
| assertTrue(t_b_2 instanceof IBasicType); |
| assertEquals(((IBasicType) t_b_2).getType(), IBasicType.t_char); |
| |
| IType t_c_1 = c.getType(); |
| assertTrue(t_c_1 instanceof IQualifierType); |
| assertTrue(((IQualifierType) t_c_1).isConst()); |
| IType t_c_2 = ((IQualifierType) t_c_1).getType(); |
| assertTrue(t_c_2 instanceof IBasicType); |
| assertEquals(((IBasicType) t_c_2).getType(), IBasicType.t_int); |
| |
| IType t_d_1 = d.getType(); |
| assertTrue(t_d_1 instanceof IPointerType); |
| assertTrue(((IPointerType) t_d_1).isConst()); |
| IType t_d_2 = ((IPointerType) t_d_1).getType(); |
| assertTrue(t_d_2 instanceof IQualifierType); |
| assertTrue(((IQualifierType) t_d_2).isConst()); |
| IType t_d_3 = ((IQualifierType) t_d_2).getType(); |
| assertTrue(t_d_3 instanceof IBasicType); |
| assertEquals(((IBasicType) t_d_3).getType(), IBasicType.t_char); |
| |
| IType t_e_1 = e.getType(); |
| assertTrue(t_e_1 instanceof IPointerType); |
| assertFalse(((IPointerType) t_e_1).isConst()); |
| IType t_e_2 = ((IPointerType) t_e_1).getType(); |
| assertTrue(t_e_2 instanceof IPointerType); |
| assertFalse(((IPointerType) t_e_2).isConst()); |
| IType t_e_3 = ((IPointerType) t_e_2).getType(); |
| assertTrue(t_e_3 instanceof IQualifierType); |
| assertTrue(((IQualifierType) t_e_3).isConst()); |
| IType t_e_4 = ((IQualifierType) t_e_3).getType(); |
| assertTrue(t_e_4 instanceof IBasicType); |
| assertEquals(((IBasicType) t_e_4).getType(), IBasicType.t_char); |
| |
| IType t_f_1 = f.getType(); |
| assertTrue(t_f_1 instanceof IPointerType); |
| assertFalse(((IPointerType) t_f_1).isConst()); |
| assertFalse(((IPointerType) t_f_1).isVolatile()); |
| IType t_f_2 = ((IPointerType) t_f_1).getType(); |
| assertTrue(t_f_2 instanceof IPointerType); |
| assertTrue(((IPointerType) t_f_2).isConst()); |
| assertFalse(((IPointerType) t_f_2).isVolatile()); |
| IType t_f_3 = ((IPointerType) t_f_2).getType(); |
| assertTrue(t_f_3 instanceof IPointerType); |
| assertFalse(((IPointerType) t_f_3).isConst()); |
| assertFalse(((IPointerType) t_f_3).isVolatile()); |
| IType t_f_4 = ((IPointerType) t_f_3).getType(); |
| assertTrue(t_f_4 instanceof IPointerType); |
| assertTrue(((IPointerType) t_f_4).isConst()); |
| assertTrue(((IPointerType) t_f_4).isVolatile()); |
| IType t_f_5 = ((IPointerType) t_f_4).getType(); |
| assertTrue(t_f_5 instanceof IPointerType); |
| assertTrue(((IPointerType) t_f_5).isConst()); |
| assertFalse(((IPointerType) t_f_5).isVolatile()); |
| IType t_f_6 = ((IPointerType) t_f_5).getType(); |
| assertTrue(t_f_6 instanceof IQualifierType); |
| assertTrue(((IQualifierType) t_f_6).isConst()); |
| IType t_f_7 = ((IQualifierType) t_f_6).getType(); |
| assertTrue(t_f_7 instanceof IBasicType); |
| assertEquals(((IBasicType) t_f_7).getType(), IBasicType.t_char); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // int plainInt = 7; |
| // signed int signedInt = -2; |
| // unsigned int unsignedInt = 99; |
| // noSpec= 12; |
| public void testBug270275_int_is_equivalent_to_signed_int() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| IType plainInt = ((IVariable)((IASTSimpleDeclaration) declarations[0]).getDeclarators()[0].getName().resolveBinding()).getType(); |
| IType signedInt = ((IVariable)((IASTSimpleDeclaration) declarations[1]).getDeclarators()[0].getName().resolveBinding()).getType(); |
| IType unsignedInt = ((IVariable)((IASTSimpleDeclaration) declarations[2]).getDeclarators()[0].getName().resolveBinding()).getType(); |
| IType noSpec = ((IVariable)((IASTSimpleDeclaration) declarations[3]).getDeclarators()[0].getName().resolveBinding()).getType(); |
| assertTrue(plainInt.isSameType(signedInt)); |
| assertFalse(plainInt.isSameType(unsignedInt)); |
| assertFalse(signedInt.isSameType(unsignedInt)); |
| assertTrue(plainInt.isSameType(noSpec)); |
| } |
| |
| // struct A {} a1; |
| // typedef struct A * AP; |
| // struct A * const a2; |
| // AP a3; |
| public void testCompositeTypes() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier(); |
| ICompositeType A = (ICompositeType) compSpec.getName().resolveBinding(); |
| IASTName name_a1 = decl.getDeclarators()[0].getName(); |
| IVariable a1 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IASTName name_A2 = ((IASTElaboratedTypeSpecifier) decl.getDeclSpecifier()).getName(); |
| IASTName name_AP = decl.getDeclarators()[0].getName(); |
| ITypedef AP = (ITypedef) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IASTName name_A3 = ((IASTElaboratedTypeSpecifier) decl.getDeclSpecifier()).getName(); |
| IVariable a2 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| IASTName name_a2 = decl.getDeclarators()[0].getName(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| IVariable a3 = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| IASTName name_a3 = decl.getDeclarators()[0].getName(); |
| IASTName name_AP2 = ((IASTNamedTypeSpecifier) decl.getDeclSpecifier()).getName(); |
| |
| IType t_a1 = a1.getType(); |
| assertSame(t_a1, A); |
| |
| IType t_a2 = a2.getType(); |
| assertTrue(t_a2 instanceof IPointerType); |
| assertTrue(((IPointerType) t_a2).isConst()); |
| assertSame(((IPointerType) t_a2).getType(), A); |
| |
| IType t_a3 = a3.getType(); |
| assertSame(t_a3, AP); |
| IType t_AP = AP.getType(); |
| assertTrue(t_AP instanceof IPointerType); |
| assertSame(((IPointerType) t_AP).getType(), A); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(compSpec.getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], compSpec.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_a1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a1); |
| |
| decls = tu.getDeclarationsInAST(name_A2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], compSpec.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_AP.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_AP); |
| |
| decls = tu.getDeclarationsInAST(name_A3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], compSpec.getName()); |
| |
| decls = tu.getDeclarationsInAST(name_a2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a2); |
| |
| decls = tu.getDeclarationsInAST(name_AP2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_AP); |
| |
| decls = tu.getDeclarationsInAST(name_a3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a3); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // int a[restrict]; |
| // char * b[][]; |
| // const char * const c[][][]; |
| // char* d[const][]; |
| public void testArrayTypes() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTName name_a = decl.getDeclarators()[0].getName(); |
| IVariable a = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IASTName name_b = decl.getDeclarators()[0].getName(); |
| IVariable b = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IASTName name_c = decl.getDeclarators()[0].getName(); |
| IVariable c = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| IASTName name_d = decl.getDeclarators()[0].getName(); |
| IVariable d = (IVariable) decl.getDeclarators()[0].getName().resolveBinding(); |
| |
| IType t_a_1 = a.getType(); |
| assertTrue(t_a_1 instanceof ICArrayType); |
| assertTrue(((ICArrayType) t_a_1).isRestrict()); |
| IType t_a_2 = ((IArrayType) t_a_1).getType(); |
| assertTrue(t_a_2 instanceof IBasicType); |
| assertEquals(((IBasicType) t_a_2).getType(), IBasicType.t_int); |
| |
| IType t_b_1 = b.getType(); |
| assertTrue(t_b_1 instanceof IArrayType); |
| IType t_b_2 = ((IArrayType) t_b_1).getType(); |
| assertTrue(t_b_2 instanceof IArrayType); |
| IType t_b_3 = ((IArrayType) t_b_2).getType(); |
| assertTrue(t_b_3 instanceof IPointerType); |
| IType t_b_4 = ((IPointerType) t_b_3).getType(); |
| assertTrue(t_b_4 instanceof IBasicType); |
| assertEquals(((IBasicType) t_b_4).getType(), IBasicType.t_char); |
| |
| t_b_1 = d.getType(); |
| assertTrue(t_b_1 instanceof IArrayType); |
| t_b_2 = ((IArrayType) t_b_1).getType(); |
| assertTrue(t_b_2 instanceof IArrayType); |
| t_b_3 = ((IArrayType) t_b_2).getType(); |
| assertTrue(t_b_3 instanceof IPointerType); |
| t_b_4 = ((IPointerType) t_b_3).getType(); |
| assertTrue(t_b_4 instanceof IBasicType); |
| assertEquals(((IBasicType) t_b_4).getType(), IBasicType.t_char); |
| |
| IType t_c_1 = c.getType(); |
| assertTrue(t_c_1 instanceof IArrayType); |
| IType t_c_2 = ((IArrayType) t_c_1).getType(); |
| assertTrue(t_c_2 instanceof IArrayType); |
| IType t_c_3 = ((IArrayType) t_c_2).getType(); |
| assertTrue(t_c_3 instanceof IArrayType); |
| IType t_c_4 = ((IArrayType) t_c_3).getType(); |
| assertTrue(t_c_4 instanceof IPointerType); |
| assertTrue(((IPointerType) t_c_4).isConst()); |
| IType t_c_5 = ((IPointerType) t_c_4).getType(); |
| assertTrue(t_c_5 instanceof IQualifierType); |
| assertTrue(((IQualifierType) t_c_5).isConst()); |
| IType t_c_6 = ((IQualifierType) t_c_5).getType(); |
| assertTrue(t_c_6 instanceof IBasicType); |
| assertEquals(((IBasicType) t_c_6).getType(), IBasicType.t_char); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_a.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_a); |
| |
| decls = tu.getDeclarationsInAST(name_b.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_b); |
| |
| decls = tu.getDeclarationsInAST(name_c.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_c); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // struct A; |
| // int * f(int i, char c); |
| // void (*g) (struct A *); |
| // void (* (*h)(struct A**)) (int d); |
| public void testFunctionTypes() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTElaboratedTypeSpecifier elabSpec = (IASTElaboratedTypeSpecifier) decl.getDeclSpecifier(); |
| ICompositeType A = (ICompositeType) elabSpec.getName().resolveBinding(); |
| IASTName name_A1 = elabSpec.getName(); |
| assertTrue(name_A1.isDeclaration()); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| IFunction f = (IFunction) decl.getDeclarators()[0].getName().resolveBinding(); |
| IASTName name_f = decl.getDeclarators()[0].getName(); |
| IASTName name_i = ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getParameters()[0].getDeclarator().getName(); |
| IASTName name_c = ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getParameters()[1].getDeclarator().getName(); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IVariable g = (IVariable) decl.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding(); |
| IASTName name_g = decl.getDeclarators()[0].getNestedDeclarator().getName(); |
| IASTName name_A2 = ((IASTElaboratedTypeSpecifier) ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getParameters()[0].getDeclSpecifier()).getName(); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| IVariable h = (IVariable) decl.getDeclarators()[0].getNestedDeclarator().getNestedDeclarator().getName().resolveBinding(); |
| IASTName name_h = decl.getDeclarators()[0].getNestedDeclarator().getNestedDeclarator().getName(); |
| IASTName name_A3 = ((IASTElaboratedTypeSpecifier) ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0].getNestedDeclarator()).getParameters()[0] |
| .getDeclSpecifier()).getName(); |
| IASTName name_d = ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getParameters()[0].getDeclarator().getName(); |
| |
| IFunctionType t_f = f.getType(); |
| IType t_f_return = t_f.getReturnType(); |
| assertTrue(t_f_return instanceof IPointerType); |
| assertTrue(((IPointerType) t_f_return).getType() instanceof IBasicType); |
| IType[] t_f_params = t_f.getParameterTypes(); |
| assertEquals(t_f_params.length, 2); |
| assertTrue(t_f_params[0] instanceof IBasicType); |
| assertTrue(t_f_params[1] instanceof IBasicType); |
| |
| // g is a pointer to a function that returns void and has 1 parameter |
| // struct A * |
| IType t_g = g.getType(); |
| assertTrue(t_g instanceof IPointerType); |
| assertTrue(((IPointerType) t_g).getType() instanceof IFunctionType); |
| IFunctionType t_g_func = (IFunctionType) ((IPointerType) t_g).getType(); |
| IType t_g_func_return = t_g_func.getReturnType(); |
| assertTrue(t_g_func_return instanceof IBasicType); |
| IType[] t_g_func_params = t_g_func.getParameterTypes(); |
| assertEquals(t_g_func_params.length, 1); |
| IType t_g_func_p1 = t_g_func_params[0]; |
| assertTrue(t_g_func_p1 instanceof IPointerType); |
| assertSame(((IPointerType) t_g_func_p1).getType(), A); |
| |
| // h is a pointer to a function that returns a pointer to a function |
| // the returned pointer to function returns void and takes 1 parameter |
| // int |
| // the *h function takes 1 parameter struct A** |
| IType t_h = h.getType(); |
| assertTrue(t_h instanceof IPointerType); |
| assertTrue(((IPointerType) t_h).getType() instanceof IFunctionType); |
| IFunctionType t_h_func = (IFunctionType) ((IPointerType) t_h).getType(); |
| IType t_h_func_return = t_h_func.getReturnType(); |
| IType[] t_h_func_params = t_h_func.getParameterTypes(); |
| assertEquals(t_h_func_params.length, 1); |
| IType t_h_func_p1 = t_h_func_params[0]; |
| assertTrue(t_h_func_p1 instanceof IPointerType); |
| assertTrue(((IPointerType) t_h_func_p1).getType() instanceof IPointerType); |
| assertSame(((IPointerType) ((IPointerType) t_h_func_p1).getType()).getType(), A); |
| |
| assertTrue(t_h_func_return instanceof IPointerType); |
| IFunctionType h_return = (IFunctionType) ((IPointerType) t_h_func_return).getType(); |
| IType h_r = h_return.getReturnType(); |
| IType[] h_ps = h_return.getParameterTypes(); |
| assertTrue(h_r instanceof IBasicType); |
| assertEquals(h_ps.length, 1); |
| assertTrue(h_ps[0] instanceof IBasicType); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_A1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_A1); |
| |
| decls = tu.getDeclarationsInAST(name_f.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_f); |
| |
| decls = tu.getDeclarationsInAST(name_i.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_i); |
| |
| decls = tu.getDeclarationsInAST(name_c.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_c); |
| |
| decls = tu.getDeclarationsInAST(name_g.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_g); |
| |
| decls = tu.getDeclarationsInAST(name_A2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_A1); |
| |
| decls = tu.getDeclarationsInAST(name_h.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_h); |
| |
| decls = tu.getDeclarationsInAST(name_A3.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_A1); |
| |
| assertNull("Expected null, got "+name_d.resolveBinding(), name_d.resolveBinding()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef struct { |
| // int x; |
| // int y; |
| // } Coord; |
| // typedef struct { |
| // Coord *pos; |
| // int width; |
| // } Point; |
| // int main(int argc, char *argv[]) |
| // { |
| // Coord xy = {.y = 10, .x = 11}; |
| // Point point = {.width = 100, .pos = &xy}; |
| // } |
| public void testDesignatedInitializers() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| assertNotNull(tu); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| IASTName name_Coord = ((IASTSimpleDeclaration) declarations[0]).getDeclarators()[0].getName(); |
| IASTName name_x = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) ((IASTSimpleDeclaration) declarations[0]).getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); |
| IASTName name_y = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) ((IASTSimpleDeclaration) declarations[0]).getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); |
| IASTName name_Point = ((IASTSimpleDeclaration) declarations[1]).getDeclarators()[0].getName(); |
| IASTName name_pos = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) ((IASTSimpleDeclaration) declarations[1]).getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); |
| IASTName name_width = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) ((IASTSimpleDeclaration) declarations[1]).getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); |
| IASTFunctionDefinition main = (IASTFunctionDefinition) declarations[2]; |
| IASTStatement[] statements = ((IASTCompoundStatement) main.getBody()).getStatements(); |
| |
| IASTSimpleDeclaration xy = (IASTSimpleDeclaration) ((IASTDeclarationStatement) statements[0]).getDeclaration(); |
| IASTName name_Coord2 = ((IASTNamedTypeSpecifier) xy.getDeclSpecifier()).getName(); |
| IASTName name_xy = xy.getDeclarators()[0].getName(); |
| IASTDeclarator declarator_xy = xy.getDeclarators()[0]; |
| IASTInitializer[] initializers1 = ((IASTInitializerList) ((IASTEqualsInitializer) declarator_xy.getInitializer()).getInitializerClause()).getInitializers(); |
| IASTName name_y2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers1[0]).getDesignators()[0]).getName(); |
| |
| // test bug 87649 |
| assertEquals(((ASTNode) (ICASTDesignatedInitializer) initializers1[0]).getLength(), 7); |
| |
| IASTName name_x2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers1[1]).getDesignators()[0]).getName(); |
| |
| IASTSimpleDeclaration point = (IASTSimpleDeclaration) ((IASTDeclarationStatement) statements[1]).getDeclaration(); |
| IASTName name_Point2 = ((IASTNamedTypeSpecifier) point.getDeclSpecifier()).getName(); |
| IASTName name_point = point.getDeclarators()[0].getName(); |
| IASTDeclarator declarator_point = point.getDeclarators()[0]; |
| IASTInitializer[] initializers2 = ((IASTInitializerList) ((IASTEqualsInitializer) declarator_point.getInitializer()).getInitializerClause()).getInitializers(); |
| IASTName name_width2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers2[0]).getDesignators()[0]).getName(); |
| IASTName name_pos2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers2[1]).getDesignators()[0]).getName(); |
| IASTName name_xy2 = ((IASTIdExpression) ((IASTUnaryExpression) ((IASTEqualsInitializer) ((ICASTDesignatedInitializer) initializers2[1]).getOperandInitializer()).getInitializerClause()).getOperand()).getName(); |
| |
| for (int j = 0; j < 2; ++j) { |
| ICASTDesignatedInitializer designatedInitializer = (ICASTDesignatedInitializer) initializers1[j]; |
| assertEquals(designatedInitializer.getDesignators().length, 1); |
| ICASTFieldDesignator fieldDesignator = (ICASTFieldDesignator) designatedInitializer.getDesignators()[0]; |
| assertNotNull(fieldDesignator.getName().toString()); |
| } |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(name_Coord2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_Coord); |
| |
| decls = tu.getDeclarationsInAST(name_xy.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_xy); |
| |
| decls = tu.getDeclarationsInAST(name_y2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_y); |
| |
| decls = tu.getDeclarationsInAST(name_x2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_x); |
| |
| decls = tu.getDeclarationsInAST(name_Point2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_Point); |
| |
| decls = tu.getDeclarationsInAST(name_point.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_point); |
| |
| decls = tu.getDeclarationsInAST(name_width2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_width); |
| |
| decls = tu.getDeclarationsInAST(name_pos2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_pos); |
| |
| decls = tu.getDeclarationsInAST(name_xy2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_xy); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // struct S { |
| // int a; |
| // int b; |
| // } s; |
| // int f() { |
| // struct S s = {.a=1,.b=2}; |
| // } |
| public void testMoregetDeclarationsInAST1() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration S_decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTFunctionDefinition f_def = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| |
| IASTName a1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); |
| IASTName b1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); |
| final IASTDeclarator dtor = ((IASTSimpleDeclaration) ((IASTDeclarationStatement) ((IASTCompoundStatement) f_def.getBody()).getStatements()[0]).getDeclaration()).getDeclarators()[0]; |
| final IASTInitializerList initializerList = (IASTInitializerList) ((IASTEqualsInitializer) dtor.getInitializer()).getInitializerClause(); |
| IASTName a2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializerList.getInitializers()[0]).getDesignators()[0]).getName(); |
| IASTName b2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializerList.getInitializers()[1]).getDesignators()[0]).getName(); |
| |
| assertEquals(a1.resolveBinding(), a2.resolveBinding()); |
| assertEquals(b1.resolveBinding(), b2.resolveBinding()); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(a1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(a1, decls[0]); |
| |
| decls = tu.getDeclarationsInAST(b1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(b1, decls[0]); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // struct S { |
| // int a; |
| // int b; |
| // } s = {.a=1,.b=2}; |
| public void testMoregetDeclarationsInAST2() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration S_decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| |
| IASTName a1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); |
| IASTName b1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); |
| final IASTInitializer[] initializers = ((IASTInitializerList) ((IASTEqualsInitializer) S_decl.getDeclarators()[0].getInitializer()).getInitializerClause()).getInitializers(); |
| IASTName a2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers[0]).getDesignators()[0]).getName(); |
| IASTName b2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) initializers[1]).getDesignators()[0]).getName(); |
| |
| assertEquals(a1.resolveBinding(), a2.resolveBinding()); |
| assertEquals(b1.resolveBinding(), b2.resolveBinding()); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(a1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(a1, decls[0]); |
| |
| decls = tu.getDeclarationsInAST(b1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(b1, decls[0]); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef struct S { |
| // int a; |
| // int b; |
| // } s; |
| // typedef s t; |
| // typedef t y; |
| // y x = {.a=1,.b=2}; |
| public void testMoregetDeclarationsInAST3() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration S_decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTSimpleDeclaration x_decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| |
| IASTName a1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[0]).getDeclarators()[0].getName(); |
| IASTName b1 = ((IASTSimpleDeclaration) ((IASTCompositeTypeSpecifier) S_decl.getDeclSpecifier()).getMembers()[1]).getDeclarators()[0].getName(); |
| IASTInitializer initializer = x_decl.getDeclarators()[0].getInitializer(); |
| initializer= (IASTInitializer) ((IASTEqualsInitializer) initializer).getInitializerClause(); |
| IASTName a2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) ((IASTInitializerList) initializer).getInitializers()[0]).getDesignators()[0]).getName(); |
| IASTName b2 = ((ICASTFieldDesignator) ((ICASTDesignatedInitializer) ((IASTInitializerList) initializer).getInitializers()[1]).getDesignators()[0]).getName(); |
| |
| assertEquals(a1.resolveBinding(), a2.resolveBinding()); |
| assertEquals(b1.resolveBinding(), b2.resolveBinding()); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(a1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(a1, decls[0]); |
| |
| decls = tu.getDeclarationsInAST(b1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(b1, decls[0]); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testFnReturningPtrToFn() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "void (* f(int))() {}", C); //$NON-NLS-1$ |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTFunctionDefinition def = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| final IASTName fname = def.getDeclarator().getName(); |
| IFunction f = (IFunction) fname.resolveBinding(); |
| |
| IFunctionType ft = f.getType(); |
| assertTrue(ft.getReturnType() instanceof IPointerType); |
| assertTrue(((IPointerType) ft.getReturnType()).getType() instanceof IFunctionType); |
| assertEquals(ft.getParameterTypes().length, 1); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(f); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], fname); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // test C99: 6.7.5.3-7 A declaration of a parameter as ''array of type'' |
| // shall be adjusted to ''qualified pointer to |
| // type'', where the type qualifiers (if any) are those specified within the |
| // [ and ] of the |
| // array type derivation. |
| public void testArrayTypeToQualifiedPointerTypeParm() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "void f(int parm[const 3]);", C); //$NON-NLS-1$ |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration def = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IFunction f = (IFunction) def.getDeclarators()[0].getName().resolveBinding(); |
| |
| IFunctionType ft = f.getType(); |
| assertTrue(ft.getParameterTypes()[0] instanceof IPointerType); |
| assertTrue(((IPointerType) ft.getParameterTypes()[0]).isConst()); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName name_parm = ((IASTStandardFunctionDeclarator) def.getDeclarators()[0]).getParameters()[0].getDeclarator().getName(); |
| IASTName[] decls = tu.getDeclarationsInAST(name_parm.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_parm); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void func(int** p); |
| // |
| // void test(int a[]) { |
| // func(&a); |
| // } |
| public void testArrayPointer_261417() throws Exception { |
| String code= getAboveComment(); |
| BindingAssertionHelper baC= new BindingAssertionHelper(code, false); |
| baC.assertNonProblem("func(&a)", 4, IFunction.class); |
| BindingAssertionHelper baCpp= new BindingAssertionHelper(code, true); |
| baCpp.assertNonProblem("func(&a)", 4, ICPPFunction.class); |
| } |
| |
| // int f() {} |
| // int *f2() {} |
| // int (* f3())() {} |
| public void testFunctionDefTypes() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTFunctionDefinition def1 = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IFunction f = (IFunction) def1.getDeclarator().getName().resolveBinding(); |
| IASTFunctionDefinition def2 = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IFunction f2 = (IFunction) def2.getDeclarator().getName().resolveBinding(); |
| IASTFunctionDefinition def3 = (IASTFunctionDefinition) tu.getDeclarations()[2]; |
| IFunction f3 = (IFunction) def3.getDeclarator().getName().resolveBinding(); |
| |
| IFunctionType ft = f.getType(); |
| IFunctionType ft2 = f2.getType(); |
| IFunctionType ft3 = f3.getType(); |
| |
| assertTrue(ft.getReturnType() instanceof IBasicType); |
| assertTrue(ft2.getReturnType() instanceof IPointerType); |
| assertTrue(((IPointerType) ft2.getReturnType()).getType() instanceof IBasicType); |
| assertTrue(ft3.getReturnType() instanceof IPointerType); |
| assertTrue(((IPointerType) ft3.getReturnType()).getType() instanceof IFunctionType); |
| assertTrue(((IFunctionType) ((IPointerType) ft3.getReturnType()).getType()).getReturnType() |
| instanceof IBasicType); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(def1.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], def1.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(def2.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], def2.getDeclarator().getName()); |
| |
| decls = tu.getDeclarationsInAST(def3.getDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], def3.getDeclarator().getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // any parameter to type function returning T is adjusted to be pointer to |
| // function returning T |
| public void testParmToFunction() throws Exception { |
| IASTTranslationUnit tu = parse("int f(int g(void)) { return g();}", C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTFunctionDefinition def = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IFunction f = (IFunction) def.getDeclarator().getName().resolveBinding(); |
| |
| IType ft = ((CFunction) f).getType(); |
| assertTrue(ft instanceof IFunctionType); |
| IType gt_1 = ((IFunctionType) ft).getParameterTypes()[0]; |
| assertTrue(gt_1 instanceof IPointerType); |
| IType gt_2 = ((IPointerType) gt_1).getType(); |
| assertTrue(gt_2 instanceof IFunctionType); |
| IType gt_ret = ((IFunctionType) gt_2).getReturnType(); |
| assertTrue(gt_ret instanceof IBasicType); |
| assertEquals(((IBasicType) gt_ret).getKind(), IBasicType.Kind.eInt); |
| assertEquals(0, ((IFunctionType) gt_2).getParameterTypes().length); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| assertTrue(def.getDeclarator() instanceof IASTStandardFunctionDeclarator); |
| IASTName name_g = ((IASTStandardFunctionDeclarator) def.getDeclarator()).getParameters()[0].getDeclarator().getName(); |
| IASTName name_g_call = |
| ((IASTIdExpression) ((IASTFunctionCallExpression) ((IASTReturnStatement) ((IASTCompoundStatement) def.getBody()).getStatements()[0]).getReturnValue()).getFunctionNameExpression()).getName(); |
| IASTName[] decls = tu.getDeclarationsInAST(name_g_call.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_g); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testArrayPointerFunction() throws Exception { |
| IASTTranslationUnit tu = parse("int (*v[])(int *x, int *y);", C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IVariable v = (IVariable) ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getNestedDeclarator().getName().resolveBinding(); |
| |
| IType vt_1 = v.getType(); |
| assertTrue(vt_1 instanceof IArrayType); |
| IType vt_2 = ((IArrayType) vt_1).getType(); |
| assertTrue(vt_2 instanceof IPointerType); |
| IType vt_3 = ((IPointerType) vt_2).getType(); |
| assertTrue(vt_3 instanceof IFunctionType); |
| IType vt_ret = ((IFunctionType) vt_3).getReturnType(); |
| assertTrue(vt_ret instanceof IBasicType); |
| assertEquals(((IBasicType) vt_ret).getType(), IBasicType.t_int); |
| assertEquals(((IFunctionType) vt_3).getParameterTypes().length, 2); |
| IType vpt_1 = ((IFunctionType) vt_3).getParameterTypes()[0]; |
| assertTrue(vpt_1 instanceof IPointerType); |
| IType vpt_1_2 = ((IPointerType) vpt_1).getType(); |
| assertTrue(vpt_1_2 instanceof IBasicType); |
| assertEquals(((IBasicType) vpt_1_2).getType(), IBasicType.t_int); |
| IType vpt_2 = ((IFunctionType) vt_3).getParameterTypes()[0]; |
| assertTrue(vpt_2 instanceof IPointerType); |
| IType vpt_2_2 = ((IPointerType) vpt_1).getType(); |
| assertTrue(vpt_2_2 instanceof IBasicType); |
| assertEquals(((IBasicType) vpt_2_2).getType(), IBasicType.t_int); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName[] decls = tu.getDeclarationsInAST(((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getNestedDeclarator().getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], ((IASTStandardFunctionDeclarator) decl.getDeclarators()[0]).getNestedDeclarator().getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef void DWORD; |
| // typedef DWORD v; |
| // v signal(int); |
| public void testTypedefExample4a() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| ITypedef dword = (ITypedef) decl1.getDeclarators()[0].getName().resolveBinding(); |
| IType dword_t = dword.getType(); |
| assertTrue(dword_t instanceof IBasicType); |
| assertEquals(((IBasicType) dword_t).getType(), IBasicType.t_void); |
| |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| ITypedef v = (ITypedef) decl2.getDeclarators()[0].getName().resolveBinding(); |
| IType v_t_1 = v.getType(); |
| assertTrue(v_t_1 instanceof ITypedef); |
| IType v_t_2 = ((ITypedef) v_t_1).getType(); |
| assertTrue(v_t_2 instanceof IBasicType); |
| assertEquals(((IBasicType) v_t_2).getType(), IBasicType.t_void); |
| |
| IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IFunction signal = (IFunction) decl3.getDeclarators()[0].getName().resolveBinding(); |
| IFunctionType signal_t = signal.getType(); |
| IType signal_ret = signal_t.getReturnType(); |
| assertTrue(signal_ret instanceof ITypedef); |
| IType signal_ret2 = ((ITypedef) signal_ret).getType(); |
| assertTrue(signal_ret2 instanceof ITypedef); |
| IType signal_ret3 = ((ITypedef) signal_ret2).getType(); |
| assertTrue(signal_ret3 instanceof IBasicType); |
| assertEquals(((IBasicType) signal_ret3).getType(), IBasicType.t_void); |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName name_DWORD = decl1.getDeclarators()[0].getName(); |
| IASTName name_v = decl2.getDeclarators()[0].getName(); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(name_DWORD.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_DWORD); |
| |
| decls = tu.getDeclarationsInAST(((IASTNamedTypeSpecifier) decl2.getDeclSpecifier()).getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_DWORD); |
| |
| decls = tu.getDeclarationsInAST(((IASTNamedTypeSpecifier) decl3.getDeclSpecifier()).getName().resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_v); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef void DWORD; |
| // typedef DWORD (*pfv)(int); |
| // pfv signal(int, pfv); |
| public void testTypedefExample4b() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl1 = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| ITypedef dword = (ITypedef) decl1.getDeclarators()[0].getName().resolveBinding(); |
| IType dword_t = dword.getType(); |
| assertTrue(dword_t instanceof IBasicType); |
| assertEquals(((IBasicType) dword_t).getType(), IBasicType.t_void); |
| |
| IASTSimpleDeclaration decl2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| ITypedef pfv = (ITypedef) decl2.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding(); |
| IType pfv_t_1 = pfv.getType(); |
| assertTrue(pfv_t_1 instanceof IPointerType); |
| IType pfv_t_2 = ((IPointerType) pfv_t_1).getType(); |
| assertTrue(pfv_t_2 instanceof IFunctionType); |
| IType pfv_t_2_ret_1 = ((IFunctionType) pfv_t_2).getReturnType(); |
| assertTrue(pfv_t_2_ret_1 instanceof ITypedef); |
| IType pfv_t_2_ret_2 = ((ITypedef) pfv_t_2_ret_1).getType(); |
| assertTrue(pfv_t_2_ret_2 instanceof IBasicType); |
| assertEquals(((IBasicType) pfv_t_2_ret_2).getType(), IBasicType.t_void); |
| assertTrue(((ITypedef) pfv_t_2_ret_1).getName().equals("DWORD")); //$NON-NLS-1$ |
| IType pfv_t_2_parm = ((IFunctionType) pfv_t_2).getParameterTypes()[0]; |
| assertTrue(pfv_t_2_parm instanceof IBasicType); |
| assertEquals(((IBasicType) pfv_t_2_parm).getType(), IBasicType.t_int); |
| |
| IASTSimpleDeclaration decl3 = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| IFunction signal = (IFunction) decl3.getDeclarators()[0].getName().resolveBinding(); |
| IFunctionType signal_t = signal.getType(); |
| IType signal_ret_1 = signal_t.getReturnType(); |
| assertTrue(signal_ret_1 instanceof ITypedef); |
| IType signal_ret_2 = ((ITypedef) signal_ret_1).getType(); |
| assertTrue(signal_ret_2 instanceof IPointerType); |
| IType signal_ret_3 = ((IPointerType) signal_ret_2).getType(); |
| assertTrue(signal_ret_3 instanceof IFunctionType); |
| IType signal_ret_ret_1 = ((IFunctionType) signal_ret_3).getReturnType(); |
| assertTrue(signal_ret_ret_1 instanceof ITypedef); |
| IType signal_ret_ret_2 = ((ITypedef) signal_ret_ret_1).getType(); |
| assertTrue(signal_ret_ret_2 instanceof IBasicType); |
| assertEquals(((IBasicType) signal_ret_ret_2).getType(), IBasicType.t_void); |
| assertTrue(((ITypedef) signal_ret_ret_1).getName().equals("DWORD")); //$NON-NLS-1$ |
| |
| IType signal_parm_t1 = signal_t.getParameterTypes()[0]; |
| assertTrue(signal_parm_t1 instanceof IBasicType); |
| assertEquals(((IBasicType) signal_parm_t1).getType(), IBasicType.t_int); |
| IType signal_parm_t2 = signal_t.getParameterTypes()[1]; |
| assertTrue(signal_parm_t2 instanceof ITypedef); |
| IType signal_parm_t2_1 = ((ITypedef) signal_parm_t2).getType(); |
| assertTrue(signal_parm_t2_1 instanceof IPointerType); |
| IType signal_parm_t2_2 = ((IPointerType) signal_parm_t2_1).getType(); |
| assertTrue(signal_parm_t2_2 instanceof IFunctionType); |
| IType signal_parm_t2_ret_1 = ((IFunctionType) signal_parm_t2_2).getReturnType(); |
| assertTrue(signal_parm_t2_ret_1 instanceof ITypedef); |
| IType signal_parm_t2_ret_2 = ((ITypedef) signal_parm_t2_ret_1).getType(); |
| assertTrue(signal_parm_t2_ret_2 instanceof IBasicType); |
| assertEquals(((IBasicType) signal_parm_t2_ret_2).getType(), |
| IBasicType.t_void); |
| assertTrue(((ITypedef) signal_parm_t2_ret_1).getName().equals("DWORD")); //$NON-NLS-1$ |
| |
| // test tu.getDeclarationsInAST(IBinding) |
| IASTName name_pfv = decl2.getDeclarators()[0].getNestedDeclarator().getName(); |
| IASTName name_pfv1 = ((IASTNamedTypeSpecifier) decl3.getDeclSpecifier()).getName(); |
| IASTName name_pfv2 = ((IASTNamedTypeSpecifier) ((IASTStandardFunctionDeclarator) decl3 |
| .getDeclarators()[0]).getParameters()[1].getDeclSpecifier()).getName(); |
| |
| IASTName[] decls = tu.getDeclarationsInAST(name_pfv1.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_pfv); |
| |
| decls = tu.getDeclarationsInAST(name_pfv2.resolveBinding()); |
| assertEquals(decls.length, 1); |
| assertEquals(decls[0], name_pfv); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef void fv(int), (*pfv)(int); |
| // void (*signal1(int, void (*)(int)))(int); |
| // fv *signal2(int, fv *); |
| // pfv signal3(int, pfv); |
| public void testTypedefExample4c() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0]; |
| IASTDeclarator[] declarators = decl.getDeclarators(); |
| ITypedef fv = (ITypedef) declarators[0].getName().resolveBinding(); |
| ITypedef pfv = (ITypedef) declarators[1].getNestedDeclarator().getName().resolveBinding(); |
| |
| IType fv_t = fv.getType(); |
| assertEquals(((IBasicType) ((IFunctionType) fv_t).getReturnType()).getType(), |
| IBasicType.t_void); |
| assertEquals(((IBasicType) ((IFunctionType) fv_t).getParameterTypes()[0]).getType(), |
| IBasicType.t_int); |
| |
| IType pfv_t = pfv.getType(); |
| assertEquals(((IBasicType) ((IFunctionType) ((IPointerType) pfv_t) |
| .getType()).getReturnType()).getType(), IBasicType.t_void); |
| assertEquals(((IBasicType) ((IFunctionType) ((IPointerType) pfv |
| .getType()).getType()).getParameterTypes()[0]).getType(), |
| IBasicType.t_int); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[1]; |
| declarators = decl.getDeclarators(); |
| IFunction signal1 = (IFunction) declarators[0].getNestedDeclarator().getName().resolveBinding(); |
| IType signal1_t = signal1.getType(); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[2]; |
| declarators = decl.getDeclarators(); |
| IFunction signal2 = (IFunction) declarators[0].getName().resolveBinding(); |
| IType signal2_t = signal2.getType(); |
| |
| decl = (IASTSimpleDeclaration) tu.getDeclarations()[3]; |
| declarators = decl.getDeclarators(); |
| IFunction signal3 = (IFunction) declarators[0].getName().resolveBinding(); |
| IType signal3_t = signal3.getType(); |
| |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((IFunctionType) signal1_t) |
| .getReturnType()).getType()).getReturnType()).getType(), |
| IBasicType.t_void); |
| assertEquals(((IBasicType) ((IFunctionType) signal1_t) |
| .getParameterTypes()[0]).getType(), IBasicType.t_int); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((IFunctionType) signal1_t) |
| .getParameterTypes()[1]).getType()).getReturnType()) |
| .getType(), IBasicType.t_void); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((IFunctionType) signal1_t) |
| .getParameterTypes()[1]).getType()).getParameterTypes()[0]) |
| .getType(), IBasicType.t_int); |
| |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((ITypedef) ((IPointerType) ((IFunctionType) signal2_t) |
| .getReturnType()).getType()).getType()).getReturnType()) |
| .getType(), IBasicType.t_void); |
| assertEquals(((IBasicType) ((IFunctionType) signal2_t).getParameterTypes()[0]).getType(), |
| IBasicType.t_int); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((ITypedef) ((IPointerType) ((IFunctionType) signal2_t) |
| .getParameterTypes()[1]).getType()).getType()) |
| .getReturnType()).getType(), IBasicType.t_void); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((ITypedef) ((IPointerType) ((IFunctionType) signal2_t) |
| .getParameterTypes()[1]).getType()).getType()) |
| .getParameterTypes()[0]).getType(), IBasicType.t_int); |
| |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((ITypedef) ((IFunctionType) signal3_t) |
| .getReturnType()).getType()).getType()).getReturnType()) |
| .getType(), IBasicType.t_void); |
| assertEquals(((IBasicType) ((IFunctionType) signal3_t) |
| .getParameterTypes()[0]).getType(), IBasicType.t_int); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((ITypedef) ((IFunctionType) signal3_t) |
| .getParameterTypes()[1]).getType()).getType()) |
| .getReturnType()).getType(), IBasicType.t_void); |
| assertEquals( |
| ((IBasicType) ((IFunctionType) ((IPointerType) ((ITypedef) ((IFunctionType) signal3_t) |
| .getParameterTypes()[1]).getType()).getType()) |
| .getParameterTypes()[0]).getType(), IBasicType.t_int); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // const int x = 10; |
| // int y [ const static x ]; |
| public void testBug80992() throws Exception { |
| ICASTArrayModifier mod = (ICASTArrayModifier) ((IASTArrayDeclarator) ((IASTSimpleDeclaration) parse( |
| getAboveComment(), C).getDeclarations()[1]) |
| .getDeclarators()[0]).getArrayModifiers()[0]; |
| assertTrue(mod.isConst()); |
| assertTrue(mod.isStatic()); |
| assertFalse(mod.isRestrict()); |
| assertFalse(mod.isVolatile()); |
| assertFalse(mod.isVariableSized()); |
| } |
| |
| |
| // int y (int [ const *]); |
| public void testBug80978() throws Exception { |
| ICASTArrayModifier mod = (ICASTArrayModifier) ((IASTArrayDeclarator) ((IASTStandardFunctionDeclarator) ((IASTSimpleDeclaration) parse( |
| getAboveComment(), C).getDeclarations()[0]) |
| .getDeclarators()[0]).getParameters()[0].getDeclarator()) |
| .getArrayModifiers()[0]; |
| assertTrue(mod.isConst()); |
| assertTrue(mod.isVariableSized()); |
| assertFalse(mod.isStatic()); |
| assertFalse(mod.isRestrict()); |
| assertFalse(mod.isVolatile()); |
| } |
| |
| //AJN: bug 77383 don't do external variables |
| // // void f() { |
| // // if (a == 0) |
| // // a = a + 3; |
| // // } |
| // public void testExternalVariable() throws Exception { |
| // IASTTranslationUnit tu = parse(getAboveComment(), C); |
| // NameCollector col = new NameCollector(); |
| // tu.accept(col); |
| // |
| // IVariable a = (IVariable) col.getName(1).resolveBinding(); |
| // assertNotNull(a); |
| // assertTrue(a instanceof ICExternalBinding); |
| // assertInstances(col, a, 3); |
| // } |
| |
| // void f() { |
| // int a = 1; |
| // if (a == 0) |
| // g(a); |
| // if (a < 0) |
| // g(a >> 1); |
| // if (a > 0) |
| // g(*(&a + 2)); |
| // } |
| public void testExternalDefs() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IVariable a = (IVariable) col.getName(1).resolveBinding(); |
| IFunction g = (IFunction) col.getName(3).resolveBinding(); |
| assertNotNull(a); |
| assertNotNull(g); |
| assertTrue(g instanceof ICExternalBinding); |
| |
| assertEquals(col.size(), 11); |
| assertInstances(col, a, 7); |
| assertInstances(col, g, 3); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // typedef struct { int x; int y; } Coord; |
| // int f() { |
| // Coord xy = { .x = 10, .y = 11 }; |
| // } |
| public void testFieldDesignators() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 9); |
| IField x = (IField) col.getName(1).resolveBinding(); |
| IField y = (IField) col.getName(2).resolveBinding(); |
| ITypedef Coord = (ITypedef) col.getName(3).resolveBinding(); |
| |
| assertInstances(col, x, 2); |
| assertInstances(col, y, 2); |
| assertInstances(col, Coord, 2); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // enum { member_one, member_two }; |
| // const char *nm[] = { |
| // [member_one] = "one", |
| // [member_two] = "two" |
| // }; |
| public void testArrayDesignator() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 6); |
| IEnumerator one = (IEnumerator) col.getName(1).resolveBinding(); |
| IEnumerator two = (IEnumerator) col.getName(2).resolveBinding(); |
| |
| assertInstances(col, one, 2); |
| assertInstances(col, two, 2); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f() { |
| // if (a == 0) |
| // g(a); |
| // else if (a < 0) |
| // g(a >> 1); |
| // else if (a > 0) |
| // g(*(&a + 2)); |
| // } |
| public void testBug83737() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| IASTIfStatement if_statement = (IASTIfStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu |
| .getDeclarations()[0]).getBody()).getStatements()[0]; |
| assertEquals(((IASTBinaryExpression) if_statement |
| .getConditionExpression()).getOperator(), |
| IASTBinaryExpression.op_equals); |
| IASTIfStatement second_if_statement = (IASTIfStatement) if_statement |
| .getElseClause(); |
| assertEquals(((IASTBinaryExpression) second_if_statement |
| .getConditionExpression()).getOperator(), |
| IASTBinaryExpression.op_lessThan); |
| IASTIfStatement third_if_statement = (IASTIfStatement) second_if_statement |
| .getElseClause(); |
| assertEquals(((IASTBinaryExpression) third_if_statement |
| .getConditionExpression()).getOperator(), |
| IASTBinaryExpression.op_greaterThan); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f() { |
| // while (1) { |
| // if (1) goto end; |
| // } |
| // end: ; |
| // } |
| public void testBug84090_LabelReferences() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| ILabel end = (ILabel) col.getName(1).resolveBinding(); |
| |
| IASTName[] refs = tu.getReferences(end); |
| assertEquals(refs.length, 1); |
| assertSame(refs[0].resolveBinding(), end); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // enum col { red, blue }; |
| // enum col c; |
| public void testBug84092_EnumReferences() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector collector = new NameCollector(); |
| tu.accept(collector); |
| |
| assertEquals(collector.size(), 5); |
| IEnumeration col = (IEnumeration) collector.getName(0).resolveBinding(); |
| |
| IASTName[] refs = tu.getReferences(col); |
| assertEquals(refs.length, 1); |
| assertSame(refs[0].resolveBinding(), col); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testBug84096_FieldDesignatorRef() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "struct s { int a; } ss = { .a = 1 }; \n", C); //$NON-NLS-1$ |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector collector = new NameCollector(); |
| tu.accept(collector); |
| |
| assertEquals(collector.size(), 4); |
| IField a = (IField) collector.getName(1).resolveBinding(); |
| |
| IASTName[] refs = tu.getReferences(a); |
| assertEquals(refs.length, 1); |
| assertSame(refs[0].resolveBinding(), a); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| public void testProblems() throws Exception { |
| IASTTranslationUnit tu = parse( |
| " a += ;", C, true, false); //$NON-NLS-1$ |
| IASTProblem[] ps = CVisitor.getProblems(tu); |
| assertEquals(1, ps.length); |
| ps[0].getMessage(); |
| } |
| |
| // enum e; |
| // enum e{ one }; |
| public void testEnumerationForwards() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| IEnumeration e = (IEnumeration) col.getName(0).resolveBinding(); |
| IEnumerator[] etors = e.getEnumerators(); |
| assertTrue(etors.length == 1); |
| assertFalse(etors[0] instanceof IProblemBinding); |
| |
| assertInstances(col, e, 2); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // void f() { |
| // int (*p) [2]; |
| // (&p)[0] = 1; |
| // } |
| public void testBug84185() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| IVariable p = (IVariable) col.getName(1).resolveBinding(); |
| assertTrue(p.getType() instanceof IPointerType); |
| assertTrue(((IPointerType) p.getType()).getType() instanceof IArrayType); |
| IArrayType at = (IArrayType) ((IPointerType) p.getType()).getType(); |
| assertTrue(at.getType() instanceof IBasicType); |
| |
| assertInstances(col, p, 2); |
| } |
| |
| // void f() { |
| // int (*p) [2]; |
| // (&p)[0] = 1; |
| // } |
| public void testBug84185_2() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| |
| IVariable p_ref = (IVariable) col.getName(2).resolveBinding(); |
| IVariable p_decl = (IVariable) col.getName(1).resolveBinding(); |
| |
| assertSame(p_ref, p_decl); |
| } |
| |
| // // example from: C99 6.5.2.5-16 |
| // struct s { int i; }; |
| // void f (void) |
| // { |
| // struct s *p = 0, *q; |
| // int j = 0; |
| // q = p; |
| // p = &((struct s) { j++ }); |
| // } |
| public void testBug84176() throws Exception { |
| parse(getAboveComment(), C, false, true); |
| } |
| |
| // struct s { double i; } f(void); |
| // struct s f(void) {} |
| public void testBug84266() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parse(code, C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertEquals(col.size(), 7); |
| |
| ICompositeType s_ref = (ICompositeType) col.getName(4).resolveBinding(); |
| ICompositeType s_decl = (ICompositeType) col.getName(0).resolveBinding(); |
| assertSame(s_ref, s_decl); |
| |
| tu = parse(code, C); |
| col = new NameCollector(); |
| tu.accept(col); |
| assertEquals(col.size(), 7); |
| |
| s_decl = (ICompositeType) col.getName(0).resolveBinding(); |
| s_ref = (ICompositeType) col.getName(4).resolveBinding(); |
| assertSame(s_ref, s_decl); |
| } |
| |
| public void testBug84266_2() throws Exception { |
| IASTTranslationUnit tu = parse("struct s f(void);", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| |
| ICompositeType s = (ICompositeType) col.getName(0).resolveBinding(); |
| assertNotNull(s); |
| |
| tu = parse("struct s f(void) {}", C); //$NON-NLS-1$ |
| col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 3); |
| |
| s = (ICompositeType) col.getName(0).resolveBinding(); |
| assertNotNull(s); |
| } |
| |
| public void testBug84250() throws Exception { |
| assertTrue(((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) parse( |
| "void f() { int (*p) [2]; }", C).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration() instanceof IASTSimpleDeclaration); //$NON-NLS-1$ |
| } |
| |
| // struct s1 { struct s2 *s2p; /* ... */ }; // D1 |
| // struct s2 { struct s1 *s1p; /* ... */ }; // D2 |
| public void testBug84186() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parse(code, lang); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertEquals(col.size(), 6); |
| |
| ICompositeType s_ref = (ICompositeType) col.getName(1).resolveBinding(); |
| ICompositeType s_decl = (ICompositeType) col.getName(3).resolveBinding(); |
| assertSame(s_ref, s_decl); |
| |
| |
| tu = parse(code, lang); |
| col = new NameCollector(); |
| tu.accept(col); |
| assertEquals(col.size(), 6); |
| |
| s_decl = (ICompositeType) col.getName(3).resolveBinding(); |
| s_ref = (ICompositeType) col.getName(1).resolveBinding(); |
| assertSame(s_ref, s_decl); |
| } |
| } |
| |
| // typedef struct { int a; } S; |
| // void g(S* (*funcp) (void)) { |
| // (*funcp)()->a; |
| // funcp()->a; |
| // } |
| public void testBug84267() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 11); |
| |
| ITypedef S = (ITypedef) col.getName(2).resolveBinding(); |
| IField a = (IField) col.getName(10).resolveBinding(); |
| IParameter funcp = (IParameter) col.getName(7).resolveBinding(); |
| assertNotNull(funcp); |
| assertInstances(col, funcp, 3); |
| assertInstances(col, a, 3); |
| |
| assertTrue(funcp.getType() instanceof IPointerType); |
| IType t = ((IPointerType) funcp.getType()).getType(); |
| assertTrue(t instanceof IFunctionType); |
| IFunctionType ft = (IFunctionType) t; |
| assertTrue(ft.getReturnType() instanceof IPointerType); |
| assertSame(((IPointerType) ft.getReturnType()).getType(), S); |
| } |
| |
| // void f(int m, int c[m][m]); |
| // void f(int m, int c[m][m]) { |
| // int x; |
| // { int x = x; } |
| // } |
| public void testBug84228() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertEquals(col.size(), 13); |
| |
| IParameter m = (IParameter) col.getName(3).resolveBinding(); |
| IVariable x3 = (IVariable) col.getName(12).resolveBinding(); |
| IVariable x2 = (IVariable) col.getName(11).resolveBinding(); |
| IVariable x1 = (IVariable) col.getName(10).resolveBinding(); |
| |
| assertSame(x2, x3); |
| assertNotSame(x1, x2); |
| |
| assertInstances(col, m, 6); |
| assertInstances(col, x1, 1); |
| assertInstances(col, x2, 2); |
| |
| IASTName[] ds = tu.getDeclarationsInAST(x2); |
| assertEquals(ds.length, 1); |
| assertSame(ds[0], col.getName(11)); |
| } |
| |
| public void testBug84236() throws Exception { |
| String code = "double maximum(double a[ ][*]);"; //$NON-NLS-1$ |
| IASTSimpleDeclaration d = (IASTSimpleDeclaration) parse(code, |
| C).getDeclarations()[0]; |
| IASTStandardFunctionDeclarator fd = (IASTStandardFunctionDeclarator) d |
| .getDeclarators()[0]; |
| IASTParameterDeclaration p = fd.getParameters()[0]; |
| IASTArrayDeclarator a = (IASTArrayDeclarator) p.getDeclarator(); |
| ICASTArrayModifier star = (ICASTArrayModifier) a.getArrayModifiers()[1]; |
| assertTrue(star.isVariableSized()); |
| |
| } |
| |
| // typedef int B; |
| // void g() { |
| // B * bp; //1 |
| // } |
| public void testBug85049() throws Exception { |
| IASTTranslationUnit t = parse(getAboveComment(), C); |
| IASTFunctionDefinition g = (IASTFunctionDefinition) t.getDeclarations()[1]; |
| IASTCompoundStatement body = (IASTCompoundStatement) g.getBody(); |
| final IASTStatement statement = body.getStatements()[0]; |
| assertTrue(statement instanceof IASTDeclarationStatement); |
| IASTSimpleDeclaration bp = (IASTSimpleDeclaration) ((IASTDeclarationStatement) statement) |
| .getDeclaration(); |
| assertTrue(bp.getDeclarators()[0].getName().resolveBinding() instanceof IVariable); |
| |
| } |
| |
| public void testBug86766() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "char foo; void foo() {}", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IVariable foo = (IVariable) col.getName(0).resolveBinding(); |
| IProblemBinding prob = (IProblemBinding) col.getName(1) |
| .resolveBinding(); |
| assertEquals(prob.getID(), IProblemBinding.SEMANTIC_INVALID_OVERLOAD); |
| assertNotNull(foo); |
| } |
| |
| public void testBug88338_C() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "struct A; struct A* a;", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertTrue(col.getName(0).isDeclaration()); |
| assertFalse(col.getName(0).isReference()); |
| assertTrue(col.getName(1).isReference()); |
| assertFalse(col.getName(1).isDeclaration()); |
| |
| tu = parse("struct A* a; struct A;", C); //$NON-NLS-1$ |
| col = new NameCollector(); |
| tu.accept(col); |
| |
| col.getName(2).resolveBinding(); |
| |
| assertTrue(col.getName(0).isDeclaration()); |
| assertFalse(col.getName(0).isReference()); |
| |
| assertTrue(col.getName(2).isDeclaration()); |
| assertFalse(col.getName(2).isReference()); |
| } |
| |
| public void test88460() throws Exception { |
| IASTTranslationUnit tu = parse("void f();", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IFunction f = (IFunction) col.getName(0).resolveBinding(); |
| assertFalse(f.isStatic()); |
| } |
| |
| public void testBug90253() throws Exception { |
| IASTTranslationUnit tu = parse("void f(int par) { int v1; };", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IFunction f = (IFunction) col.getName(0).resolveBinding(); |
| IParameter p = (IParameter) col.getName(1).resolveBinding(); |
| IVariable v1 = (IVariable) col.getName(2).resolveBinding(); |
| |
| IASTFunctionDefinition fdef= getDeclaration(tu, 0); |
| IScope scope = ((IASTCompoundStatement) fdef.getBody()).getScope(); |
| |
| IBinding[] bs = scope.find("par", tu); //$NON-NLS-1$ |
| assertEquals(1, bs.length); |
| assertSame(bs[0], p); |
| |
| bs = scope.find("v1", tu); //$NON-NLS-1$ |
| assertEquals(bs.length, 1); |
| assertSame(bs[0], v1); |
| } |
| |
| // struct S {}; |
| // int S; |
| // void f() { |
| // int S; |
| // { |
| // S : ; |
| // } |
| // } |
| public void testFind() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| ICompositeType S1 = (ICompositeType) col.getName(0).resolveBinding(); |
| IVariable S2 = (IVariable) col.getName(1).resolveBinding(); |
| IFunction f = (IFunction) col.getName(2).resolveBinding(); |
| IVariable S3 = (IVariable) col.getName(3).resolveBinding(); |
| ILabel S4 = (ILabel) col.getName(4).resolveBinding(); |
| |
| IASTFunctionDefinition fdef= getDeclaration(tu, 2); |
| IScope scope = ((IASTCompoundStatement) fdef.getBody()).getScope(); |
| |
| IBinding[] bs = scope.find("S", tu); //$NON-NLS-1$ |
| |
| assertNotNull(S2); |
| assertEquals(bs.length, 3); |
| assertSame(bs[0], S3); |
| assertSame(bs[1], S1); |
| assertSame(bs[2], S4); |
| } |
| |
| public void test92791() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "void f() { int x, y; x * y; }", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| for (int i = 0; i < col.size(); ++i) |
| assertFalse(col.getName(i).resolveBinding() instanceof IProblemBinding); |
| |
| tu = parse( |
| "int y; void f() { typedef int x; x * y; }", C); //$NON-NLS-1$ |
| col = new NameCollector(); |
| tu.accept(col); |
| for (int i = 0; i < col.size(); ++i) |
| assertFalse(col.getName(i).resolveBinding() instanceof IProblemBinding); |
| } |
| |
| public void testBug85786() throws Exception { |
| IASTTranslationUnit tu = parse( |
| "void f(int); void foo () { void * p = &f; ((void (*) (int)) p) (1); }", C); //$NON-NLS-1$ |
| NameCollector nameResolver = new NameCollector(); |
| tu.accept(nameResolver); |
| assertNoProblemBindings(nameResolver); |
| } |
| |
| // void func() { |
| // int i=0; |
| // i= i&0x00ff; |
| // i= (i)&0x00ff; |
| // } |
| public void testBug95720() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| NameCollector nameResolver = new NameCollector(); |
| tu.accept(nameResolver); |
| assertNoProblemBindings(nameResolver); |
| } |
| |
| // #define ONE(a, ...) int x |
| // #define TWO(b, args...) int y |
| // int main() |
| // { |
| // ONE("string"); /* err */ |
| // TWO("string"); /* err */ |
| // return 0; |
| // } |
| public void testBug94365() throws Exception { |
| parse(getAboveComment(), C); |
| } |
| |
| // #define MACRO(a) |
| // void main() { |
| // MACRO('"'); |
| // } |
| public void testBug95119_a() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| assertEquals(declarations.length, 1); |
| assertNotNull(declarations[0]); |
| assertTrue(declarations[0] instanceof IASTFunctionDefinition); |
| assertEquals(((IASTFunctionDefinition) declarations[0]).getDeclarator() |
| .getName().toString(), "main"); //$NON-NLS-1$ |
| assertTrue(((IASTCompoundStatement) ((IASTFunctionDefinition) declarations[0]) |
| .getBody()).getStatements()[0] instanceof IASTNullStatement); |
| } |
| |
| // #define MACRO(a) |
| // void main() { |
| // MACRO('X'); |
| // } |
| public void testBug95119_b() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| assertEquals(declarations.length, 1); |
| assertNotNull(declarations[0]); |
| assertTrue(declarations[0] instanceof IASTFunctionDefinition); |
| assertEquals(((IASTFunctionDefinition) declarations[0]).getDeclarator() |
| .getName().toString(), "main"); //$NON-NLS-1$ |
| assertTrue(((IASTCompoundStatement) ((IASTFunctionDefinition) declarations[0]) |
| .getBody()).getStatements()[0] instanceof IASTNullStatement); |
| } |
| |
| // typedef long _TYPE; |
| // typedef _TYPE TYPE; |
| // int function(TYPE (* pfv)(int parm)); |
| public void testBug81739() throws Exception { |
| parse(getAboveComment(), C); |
| } |
| |
| // float _Complex x; |
| // double _Complex y; |
| public void testBug95757() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true, true); |
| IASTDeclaration[] decls = tu.getDeclarations(); |
| |
| assertTrue(((ICASTSimpleDeclSpecifier)((IASTSimpleDeclaration) decls[0]).getDeclSpecifier()).isComplex()); |
| assertEquals(((ICASTSimpleDeclSpecifier)((IASTSimpleDeclaration) decls[0]).getDeclSpecifier()).getType(), IASTSimpleDeclSpecifier.t_float); |
| assertTrue(((ICASTSimpleDeclSpecifier)((IASTSimpleDeclaration) decls[1]).getDeclSpecifier()).isComplex()); |
| assertEquals(((ICASTSimpleDeclSpecifier)((IASTSimpleDeclaration) decls[1]).getDeclSpecifier()).getType(), IASTSimpleDeclSpecifier.t_double); |
| } |
| |
| // int foo(); |
| // typeof({ int x = foo(); |
| // x; }) zoot; |
| public void testBug93980() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IFunction foo = (IFunction) col.getName(0).resolveBinding(); |
| assertSame(foo, col.getName(2).resolveBinding()); |
| |
| IVariable zoot = (IVariable) col.getName(4).resolveBinding(); |
| IType t = zoot.getType(); |
| assertTrue(t instanceof IBasicType); |
| assertEquals(((IBasicType) t).getType(), IBasicType.t_int); |
| } |
| |
| public void testBug95866() throws Exception { |
| IASTTranslationUnit tu = parse("int test[10] = { [0 ... 9] = 2 };", C, true, true); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertNoProblemBindings(col); |
| } |
| |
| public void testBug98502() throws Exception { |
| IASTTranslationUnit tu = parse("typedef enum { ONE } e;", C, true, true); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IEnumeration etion = (IEnumeration) col.getName(0).resolveBinding(); |
| ITypedef e = (ITypedef) col.getName(2).resolveBinding(); |
| assertSame(e.getType(), etion); |
| } |
| |
| // typedef struct _loop_data { |
| // enum { PIPERR } pipe_err; |
| // } loop_data; |
| // void f() { |
| // PIPERR; |
| // } |
| public void testBug98365() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IEnumerator etor = (IEnumerator) col.getName(2).resolveBinding(); |
| assertSame(etor, col.getName(6).resolveBinding()); |
| } |
| |
| public void testBug99262() throws Exception { |
| parse("void foo() {void *f; f=__null;}", C, true, true); //$NON-NLS-1$ |
| } |
| |
| // void f1(int*) { |
| // } |
| // void f2() { |
| // f1(__null); |
| // } |
| public void testBug240567() throws Exception { |
| BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), false); |
| bh.assertNonProblem("f1(__null", 2, IFunction.class); |
| } |
| |
| // void f() { |
| // int a; |
| // { a; int a; } |
| // } |
| public void testBug98960() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IVariable a1 = (IVariable) col.getName(1).resolveBinding(); |
| IVariable a2 = (IVariable) col.getName(2).resolveBinding(); |
| IVariable a3 = (IVariable) col.getName(3).resolveBinding(); |
| |
| assertSame(a1, a2); |
| assertNotSame(a2, a3); |
| } |
| |
| public void testBug100408() throws Exception { |
| IASTTranslationUnit tu = parse("int foo() { int x=1; (x)*3; }", C); //$NON-NLS-1$ |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertNoProblemBindings(col); |
| } |
| |
| // struct nfa; |
| // void f() { |
| // struct nfa * n; |
| // freenfa(n); |
| // } |
| // static void freenfa(nfa) |
| // struct nfa * nfa; |
| // { |
| // } |
| public void testBug98760() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IFunction free = (IFunction) col.getName(4).resolveBinding(); |
| IParameter [] ps = free.getParameters(); |
| assertEquals(ps.length, 1); |
| |
| assertSame(free, col.getName(6).resolveBinding()); |
| } |
| |
| // void testCasting() { |
| // typedef struct { |
| // int employee_id; |
| // int dept_id; |
| // } Employee; |
| // #define MY_DETAILS { 20, 30 } |
| // Employee e = (Employee)MY_DETAILS; |
| // } |
| public void testBug79650() throws Exception { |
| parseAndCheckBindings(getAboveComment()); |
| } |
| |
| public void testBug80171() throws Exception { |
| parseAndCheckBindings("static var;"); //$NON-NLS-1$ |
| } |
| |
| // enum E_OPTIONCODE { |
| // red = 1, |
| // black = 2, |
| // }; |
| // void arithConversionTest(enum E_OPTIONCODE eOption) |
| // { |
| // int myColor = 5; |
| // int temp = eOption - myColor; /* Syntax error */ |
| // if (eOption-myColor) /* Invalid arithmetic conversion */ |
| // { |
| // } |
| // } |
| public void testBug79067() throws Exception { |
| parseAndCheckBindings(getAboveComment()); |
| } |
| |
| // enum COLOR { |
| // RED=1 |
| // }; |
| // enum COLOR getColor() { |
| // enum COLOR ret; |
| // return ret; |
| // } |
| public void testBug84759() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment()); |
| IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| assertEquals(fd.getDeclSpecifier().getRawSignature(), "enum COLOR"); //$NON-NLS-1$ |
| |
| } |
| |
| // int f() { |
| // int x = 4; while (x < 10) blah: ++x; |
| // } |
| public void test1043290() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment()); |
| IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IASTStatement [] statements = ((IASTCompoundStatement) fd.getBody()).getStatements(); |
| IASTWhileStatement whileStmt = (IASTWhileStatement) statements[1]; |
| IASTLabelStatement labelStmt = (IASTLabelStatement) whileStmt.getBody(); |
| assertTrue(labelStmt.getNestedStatement() instanceof IASTExpressionStatement); |
| IASTExpressionStatement es = (IASTExpressionStatement) labelStmt.getNestedStatement(); |
| assertTrue(es.getExpression() instanceof IASTUnaryExpression); |
| } |
| |
| // void f() { |
| // int x; |
| // for (int x; ;) |
| // blah: x; |
| // } |
| public void testBug104390_2() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, true); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| IVariable x = (IVariable) col.getName(1).resolveBinding(); |
| IVariable x2 = (IVariable) col.getName(2).resolveBinding(); |
| assertNotSame(x, x2); |
| assertSame(x2, col.getName(4).resolveBinding()); |
| assertTrue(col.getName(3).resolveBinding() instanceof ILabel); |
| } |
| |
| // int f() { |
| // int i; |
| // do { ++i; } while (i < 10); |
| // return 0; |
| // } |
| public void testBug104800() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment()); |
| IASTFunctionDefinition f = (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IASTCompoundStatement body = (IASTCompoundStatement) f.getBody(); |
| assertEquals(body.getStatements().length, 3); |
| } |
| |
| public void testBug107150() throws Exception { |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("#define FUNC_PROTOTYPE_PARAMS(list) list\r\n"); //$NON-NLS-1$ |
| buffer.append("int func1 FUNC_PROTOTYPE_PARAMS((int arg1)) {\r\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\r\n"); //$NON-NLS-1$ |
| buffer.append("}\r\n"); //$NON-NLS-1$ |
| buffer.append("int func2 FUNC_PROTOTYPE_PARAMS\r\n"); //$NON-NLS-1$ |
| buffer.append("((int arg1)) {\r\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\r\n"); //$NON-NLS-1$ |
| buffer.append("}\r\n"); //$NON-NLS-1$ |
| IASTTranslationUnit tu = parse(buffer.toString(), C); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| tu = parse(buffer.toString(), CPP); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| |
| buffer = new StringBuilder(); |
| buffer.append("#define FUNC_PROTOTYPE_PARAMS(list) list\n"); //$NON-NLS-1$ |
| buffer.append("int func1 FUNC_PROTOTYPE_PARAMS((int arg1)) {\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\n"); //$NON-NLS-1$ |
| buffer.append("}\n"); //$NON-NLS-1$ |
| buffer.append("int func2 FUNC_PROTOTYPE_PARAMS\n"); //$NON-NLS-1$ |
| buffer.append("((int arg1)) {\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\n"); //$NON-NLS-1$ |
| buffer.append("}\n"); //$NON-NLS-1$ |
| tu= parse(buffer.toString(), C); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| tu= parse(buffer.toString(), CPP); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| } |
| |
| public void testBug107150b() throws Exception { |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("#define FUNC_PROTOTYPE_PARAMS(list) list\r\n"); //$NON-NLS-1$ |
| buffer.append("int func1 FUNC_PROTOTYPE_PARAMS((int arg1)) {\r\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\r\n"); //$NON-NLS-1$ |
| buffer.append("}\r\n"); //$NON-NLS-1$ |
| buffer.append("int func2 FUNC_PROTOTYPE_PARAMS\r\n \r\n \t \r\n \r\n "); //$NON-NLS-1$ |
| buffer.append("((int arg1)) {\r\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\r\n"); //$NON-NLS-1$ |
| buffer.append("}\r\n"); //$NON-NLS-1$ |
| IASTTranslationUnit tu= parse(buffer.toString(), C); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| |
| tu = parse(buffer.toString(), CPP); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| |
| buffer = new StringBuilder(); |
| buffer.append("#define FUNC_PROTOTYPE_PARAMS(list) list\n"); //$NON-NLS-1$ |
| buffer.append("int func1 FUNC_PROTOTYPE_PARAMS((int arg1)) {\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\n"); //$NON-NLS-1$ |
| buffer.append("}\n"); //$NON-NLS-1$ |
| buffer.append("int func2 FUNC_PROTOTYPE_PARAMS\n"); //$NON-NLS-1$ |
| buffer.append("((int arg1)) {\n"); //$NON-NLS-1$ |
| buffer.append("return 0;\n"); //$NON-NLS-1$ |
| buffer.append("}\n"); //$NON-NLS-1$ |
| tu = parse(buffer.toString(), C); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| tu = parse(buffer.toString(), CPP); |
| assertFalse(tu.getDeclarations()[1] instanceof IASTProblemDeclaration); |
| } |
| |
| // NWindow NewWindowDuplicate(NWindow theWindow, bool insert)\n"); |
| // { |
| // NWindow newWindow; |
| // newWindow = new GenericWindow(); |
| // if (newWindow == NULL) |
| // return NULL; |
| // TwinWindowOF(theWindow) = newWindow; |
| // TwinWindowOF(newWindow) = NULL; |
| // ParentWindowOF(newWindow) = ParentWindowOF(theWindow); |
| // DGlobalsOF(newWindow) = DGlobalsOF(theWindow); |
| // HashMapOF(newWindow) = HashMapOF(theWindow); |
| // OwnerWindowOF(newWindow) = OwnerWindowOF(theWindow); |
| // ChildOF(newWindow) = ChildOF(theWindow); |
| // MakeNameOF(newWindow, NameOF(theWindow)); |
| // KindOF(newWindow) = KindOF(theWindow); |
| // IsVisibleOF(newWindow) = IsVisibleOF(theWindow); |
| // FocusOF(newWindow) = FocusOF(theWindow); |
| // IsFloating(newWindow) = IsFloating(theWindow); |
| // HasCloseBox(newWindow) = HasCloseBox(theWindow); |
| // IsSearchNB(newWindow) = IsSearchNB(theWindow); |
| // IsFBWindow(newWindow) = FALSE; |
| // ShellOF(newWindow) = ShellOF(theWindow); |
| // DrawOnOF(newWindow) = DrawOnOF(theWindow); |
| // IsBusyOF(newWindow) = IsBusyOF(theWindow); |
| // InvalRgnOF(newWindow) = XCreateRegion(); |
| // IdleOF(newWindow) = IdleOF(theWindow); |
| // ShellPainterOF(newWindow) = ShellPainterOF(theWindow); |
| // CanvasPainterOF(newWindow) = CanvasPainterOF(theWindow); |
| // StatusPainterOF(newWindow) = StatusPainterOF(theWindow); |
| // NotebookOF(newWindow) = NotebookOF(theWindow); |
| // PopupWindowOF(newWindow) = PopupWindowOF(theWindow); |
| // IC_IsFromIM(theWindow) = FALSE; |
| // IsDestroyPendingOF(newWindow) = FALSE; |
| // if (IsNotebookWindow(newWindow)) |
| // DockedWindowOF(newWindow) = NewDockedWindow(newWindow, false); |
| // else |
| // DockedWindowOF(newWindow) = NULL; |
| // if (insert) |
| // _addToListHead(newWindow); |
| // return newWindow; |
| // } |
| public void testBug143502() throws Exception { |
| parse(getAboveComment(), C, true, false); |
| } |
| |
| // void func(int a) { |
| // int z=0; |
| // z= (a)+z; |
| // z= (a)-z; |
| // z= (a)*z; |
| // z= (a)&z; |
| // z= (a)|z; |
| // z= (a)/z; |
| // z= (a)%z; |
| // } |
| public void testBracketAroundIdentifier_168924() throws IOException, ParserException { |
| String content= getAboveComment(); |
| IASTTranslationUnit tu= parse(content, C, true, true); |
| IASTFunctionDefinition func= (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| IASTParameterDeclaration[] params= ((IASTStandardFunctionDeclarator) func.getDeclarator()).getParameters(); |
| IBinding binding= params[0].getDeclarator().getName().resolveBinding(); |
| assertEquals(7, tu.getReferences(binding).length); |
| |
| tu= parse(content, CPP, true, true); |
| func= (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| params= ((IASTStandardFunctionDeclarator) func.getDeclarator()).getParameters(); |
| binding= params[0].getDeclarator().getName().resolveBinding(); |
| assertEquals(7, tu.getReferences(binding).length); |
| } |
| |
| // #define MAC(x) x |
| // void func() { |
| // MAC("); |
| // } |
| public void testBug179383() throws ParserException, IOException { |
| parse(getAboveComment(), C, false, false); |
| } |
| |
| /** |
| * Bug in not removing single-line comments from macros. |
| * @throws Exception |
| */ |
| public void testMacroCommentsBug_177154() throws Exception { |
| // simple case |
| String simple = |
| "#define LIT 1 // my value\r\n" + |
| "int func(int x) {\r\n" + |
| "}\r\n" + |
| "int main() {\r\n" + |
| " return func(LIT); // fails to parse\r\n" + |
| "}\r\n"; |
| |
| IASTTranslationUnit tu = parse(simple, CPP, true, true); |
| |
| // actual reduced test case, plus extra cases |
| String text = |
| "#define KBOOT 1 //0x00000002\r\n" + |
| "#define KBOOT2 /* value */ 1 /* another */ //0x00000002\r\n" + |
| "#define KBOOT3 /* value \r\n" + |
| " multi line\r\n"+ |
| " comment */ 1 \\\r\n"+ |
| "/* another */ + \\\r\n"+ |
| "2 //0x00000002\r\n" + |
| "#define DEBUGNUM(x) (KDebugNum(x))\r\n" + |
| "bool KDebugNum(int aBitNum);\r\n" + |
| "#define __KTRACE_OPT(a,p) {if ((DEBUGNUM(a)))p;}\r\n" + |
| "void fail();\r\n"+ |
| "void test() {\r\n"+ |
| "__KTRACE_OPT(KBOOT,fail());\r\n" + |
| "__KTRACE_OPT(KBOOT2,fail());\r\n" + |
| "}\r\n" |
| ; |
| |
| // essential test: this code should be parseable |
| tu = parse(text, CPP, true, true); |
| |
| // verify macros |
| IASTPreprocessorMacroDefinition[] macroDefinitions = tu.getMacroDefinitions(); |
| assertEquals(5, macroDefinitions.length); |
| assertEquals("1", macroDefinitions[0].getExpansion()); |
| assertEquals("1", macroDefinitions[1].getExpansion()); |
| // regression test for #64268 and #71733 which also handle comments |
| String expectExpansion= "1 + 2"; |
| assertEquals(expectExpansion, macroDefinitions[2].getExpansion()); |
| assertEquals("(KDebugNum(x))", macroDefinitions[3].getExpansion()); |
| assertEquals("{if ((DEBUGNUM(a)))p;}", macroDefinitions[4].getExpansion()); |
| |
| // TODO: exhaustive macro testing |
| } |
| |
| // void (decl)(char); |
| // void foo() { |
| // decl('a'); |
| // } |
| public void testBug181305_1() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parse(getAboveComment(), lang, true, true); |
| |
| // check class |
| IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTCompoundStatement comp_stmt= (IASTCompoundStatement) fd.getBody(); |
| IASTExpressionStatement expr_stmt= (IASTExpressionStatement) comp_stmt.getStatements()[0]; |
| IASTFunctionCallExpression expr= (IASTFunctionCallExpression) expr_stmt.getExpression(); |
| IASTIdExpression idExpr= (IASTIdExpression) expr.getFunctionNameExpression(); |
| IBinding binding= idExpr.getName().resolveBinding(); |
| assertTrue(lang.toString(), binding instanceof IFunction); |
| assertFalse(lang.toString(), binding instanceof IProblemBinding); |
| assertEquals(binding.getName(), "decl"); |
| } |
| } |
| |
| // void (*decl)(char); |
| // void foo() { |
| // decl('a'); |
| // } |
| public void testBug181305_2() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parse(getAboveComment(), lang, true, true); |
| |
| // check class |
| IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTCompoundStatement comp_stmt= (IASTCompoundStatement) fd.getBody(); |
| IASTExpressionStatement expr_stmt= (IASTExpressionStatement) comp_stmt.getStatements()[0]; |
| IASTFunctionCallExpression expr= (IASTFunctionCallExpression) expr_stmt.getExpression(); |
| IASTIdExpression idExpr= (IASTIdExpression) expr.getFunctionNameExpression(); |
| IBinding binding= idExpr.getName().resolveBinding(); |
| assertTrue(lang.toString(), binding instanceof IVariable); |
| assertFalse(lang.toString(), binding instanceof IProblemBinding); |
| } |
| } |
| |
| public void testBug181735() throws Exception { |
| String code= |
| "int (*f)(int);\n" |
| + "int g(int n) {return n;}\n" |
| + "int g(int n, int m) {return n;}\n" |
| + "void foo() { f=g; }"; |
| |
| for (ParserLanguage lang : ParserLanguage.values()) |
| parseAndCheckBindings(code, lang); |
| } |
| |
| // void test() { |
| // char d= *"b"; |
| // } |
| public void testBug181942() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) |
| parse(getAboveComment(), lang, true, true); |
| } |
| |
| public void testMacroCommentsBug_177154_2() throws Exception { |
| String noCommentMacro = |
| "#define Sonar16G(x) ((Sonr16G(x)<<16)|0xff000000L)\r\n"; |
| String commentMacro = |
| "#define Sonar16G(x) ((Sonr16G(x)<<16)|0xff000000L) // add the varf value\r\n"; |
| |
| String textTail = "\r\n" + |
| "const int snd16SonarR[32] = {\r\n" + |
| " 0xFF000000L, Sonar16G(0x01), Sonar16G(0x02), Sonar16G(0x03),\r\n" + |
| " Sonar16G(0x04), Sonar16G(0x05), Sonar16G(0x06), Sonar16G(0x07),\r\n" + |
| " Sonar16G(0x08), Sonar16G(0x09), Sonar16G(0x0A), Sonar16G(0x0B),\r\n" + |
| " Sonar16G(0x0C), Sonar16G(0x0D), Sonar16G(0x0E), Sonar16G(0x0F),\r\n" + |
| " Sonar16G(0x10), Sonar16G(0x11), Sonar16G(0x12), Sonar16G(0x13),\r\n" + |
| " Sonar16G(0x14), Sonar16G(0x15), Sonar16G(0x16), Sonar16G(0x17),\r\n" + |
| " Sonar16G(0x18), Sonar16G(0x19), Sonar16G(0x1A), Sonar16G(0x1B),\r\n" + |
| " Sonar16G(0x1C), Sonar16G(0x1D), Sonar16G(0x1E), Sonar16G(0x1F),\r\n" + |
| " };\r\n" + |
| "\r\n" + |
| ""; |
| |
| // this should work |
| String textNoComment = noCommentMacro + textTail; |
| IASTTranslationUnit tu = parse(textNoComment, CPP, true, true); |
| |
| // this fails |
| String textComment = commentMacro + textTail; |
| tu = parse(textComment, CPP, true, true); |
| |
| } |
| |
| // int __builtin_sin; |
| public void testBug182464() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) |
| parseAndCheckBindings(getAboveComment(), lang, true); |
| } |
| |
| public void testBug186018() throws Exception { |
| String code = |
| "int main() { \n" + |
| " switch(1) { \n" + |
| " case 1 : \n" + |
| " case 2 : \n" + |
| " printf(\"pantera rules\"); \n" + |
| " } \n" + |
| "}\n"; |
| |
| parseAndCheckBindings(code, C); |
| } |
| |
| // template <typename T> |
| // class auto_ptr { |
| // private: |
| // T* ptr; |
| // public: |
| // explicit auto_ptr(T* p = 0) : ptr(p) {} |
| // ~auto_ptr() { delete ptr; } |
| // T& operator*() { return *ptr; } |
| // T* operator->() { return ptr; } |
| // }; |
| // |
| // class A { |
| // public: |
| // int method() { return 0; } |
| // }; |
| // |
| // class B { |
| // auto_ptr<A> a; |
| // |
| // void f() { |
| // int b = a->method(); // Problem: method |
| // int c = (*a).method(); // Problem: method |
| // } |
| // }; |
| public void test186736() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment(), CPP); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| IBinding methodb= col.getName(27).resolveBinding(); |
| IBinding methodc= col.getName(30).resolveBinding(); |
| assertEquals("method", methodb.getName()); |
| assertEquals("method", methodc.getName()); |
| assertInstance(methodb, ICPPMethod.class); |
| assertInstance(methodc, ICPPMethod.class); |
| assertEquals("A", ((ICPPMethod) methodb).getClassOwner().getName()); |
| assertEquals("A", ((ICPPMethod) methodc).getClassOwner().getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // template <typename T, typename U> |
| // class odd_pair { |
| // private: |
| // T* ptr1; |
| // U* ptr2; |
| // public: |
| // T* operator->() { return 0; } |
| // U* operator->() const { return 0; } |
| // }; |
| // |
| // class A { |
| // public: |
| // int method() { return 0; } |
| // }; |
| // |
| // class AA { |
| // public: |
| // int method() { return 0; } |
| // }; |
| // |
| // class B { |
| // public: |
| // odd_pair<A, AA> a1; |
| // const odd_pair<A, AA> a2; |
| // |
| // B() { |
| // } |
| // |
| // void f() { |
| // int b1 = a1->method(); // Problem: method |
| // int b2 = a2->method(); // Problem: method |
| // } |
| // }; |
| public void test186736_variant1() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment(), CPP); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| IBinding methodA= col.getName(30).resolveBinding(); |
| IBinding methodAA= col.getName(33).resolveBinding(); |
| assertEquals("method", methodA.getName()); |
| assertEquals("method", methodAA.getName()); |
| assertInstance(methodA, ICPPMethod.class); |
| assertInstance(methodAA, ICPPMethod.class); |
| assertEquals("A", ((ICPPMethod) methodA).getClassOwner().getName()); |
| assertEquals("AA", ((ICPPMethod) methodAA).getClassOwner().getName()); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // class B { |
| // public: |
| // void bar() {} |
| // }; |
| // class A { |
| // public: |
| // B* operator->() { return new B(); } |
| // void foo() {} |
| // }; |
| // |
| // void main() { |
| // A a, &aa=a, *ap= new A(); |
| // a.foo(); |
| // ap->foo(); |
| // aa.foo(); |
| // (*ap)->bar(); |
| // (&aa)->foo(); |
| // (&a)->foo(); |
| // } |
| public void test186736_variant2() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment(), CPP); |
| validateCopy(tu); |
| } |
| |
| // typedef int int32; |
| // int32 f(int32 (*p)) { |
| // return *p; |
| // } |
| public void test167833() throws Exception { |
| parseAndCheckBindings(getAboveComment(), CPP); |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // // this is a \ |
| // single line comment |
| // char str[] = " multi \ |
| // line \ |
| // string"; |
| public void testBug188707_backslashNewline() throws Exception { |
| parseAndCheckBindings(getAboveComment()); |
| } |
| |
| // typedef A B; |
| // typedef C D; |
| // typedef E E; |
| // typedef typeof(G) G; |
| // typedef H *H; |
| // typedef I *************I; |
| // typedef int (*J)(J); |
| public void testBug192165() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parse(getAboveComment(), lang, true, false); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertInstance(col.getName(0).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(1).resolveBinding(), ITypedef.class); |
| assertInstance(col.getName(2).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(3).resolveBinding(), ITypedef.class); |
| assertInstance(col.getName(4).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(5).resolveBinding(), ITypedef.class); |
| assertInstance(col.getName(6).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(7).resolveBinding(), ITypedef.class); |
| assertInstance(col.getName(8).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(9).resolveBinding(), ITypedef.class); |
| assertInstance(col.getName(10).resolveBinding(), IProblemBinding.class); |
| assertInstance(col.getName(11).resolveBinding(), ITypedef.class); |
| |
| // function ptr |
| final IBinding typedef = col.getName(12).resolveBinding(); |
| final IBinding secondJ = col.getName(13).resolveBinding(); |
| assertInstance(typedef, ITypedef.class); |
| if (lang == CPP) { |
| assertInstance(secondJ, IProblemBinding.class); |
| } else { |
| // for plain C this is actually not a problem, the second J has to be interpreted as a (useless) |
| // parameter name. |
| assertInstance(typedef, ITypedef.class); |
| isTypeEqual(((ITypedef) typedef).getType(), "int (*)(int)"); |
| } |
| } |
| } |
| |
| // /* a comment */ |
| // #define INVALID(a, b) ## a ## b |
| // INVALID(1, 2) |
| // |
| public void test192639() throws Exception { |
| parse(getAboveComment(), CPP, false, false); |
| parse(getAboveComment(), C, false, false); |
| } |
| |
| public void test195943() throws Exception { |
| final int depth= 100; |
| StringBuilder buffer = new StringBuilder(); |
| buffer.append("#define M0 1\n"); |
| for (int i = 1; i < depth; i++) { |
| buffer.append("#define M").append(i).append(" (M").append(i-1).append("+1)\n"); |
| } |
| buffer.append("int a= M").append(depth-1).append(";\n"); |
| long time= System.currentTimeMillis(); |
| parse(buffer.toString(), CPP); |
| parse(buffer.toString(), C); |
| assertTrue(System.currentTimeMillis()-time < 2000); |
| } |
| |
| // int array[12]= {}; |
| public void testBug196468_emptyArrayInitializer() throws Exception { |
| final String content = getAboveComment(); |
| parse(content, CPP, false); |
| parse(content, CPP, true); |
| parse(content, C, true); |
| try { |
| parse(content, C, false); |
| fail("C89 does not allow empty braces in array initializer"); |
| } catch (ParserException e) { |
| } |
| } |
| |
| // #define foo(f,...) |
| // void bar(void) {} |
| // int main(int argc, char **argv) { |
| // foo("a", bar); // ok |
| // foo("a", bar, bar); // ok |
| // foo("a", bar()); // Eclipse Syntax error |
| // foo("a", bar, bar()); // Eclipse Syntax error |
| // foo("a", bar(), bar); // Eclipse Syntax error |
| // return 0; |
| // } |
| public void testBug197633_parenthesisInVarargMacros() throws Exception { |
| final String content = getAboveComment(); |
| parse(content, CPP); |
| parse(content, C); |
| } |
| |
| // void (__attribute__((__stdcall__))* foo1) (int); |
| // void (* __attribute__((__stdcall__)) foo2) (int); |
| // void (* __attribute__((__stdcall__))* foo3) (int); |
| public void testBug191450_attributesInBetweenPointers() throws Exception { |
| parse(getAboveComment(), CPP, true, true); |
| parse(getAboveComment(), C, true, true); |
| } |
| |
| // class NameClash {}; |
| // namespace NameClash {}; |
| // namespace NameClash2 {}; |
| // class NameClash2 {}; |
| public void testBug202271_nameClash() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment(), CPP, true); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| assertInstance(col.getName(0).resolveBinding(), ICPPClassType.class); |
| assertInstance(col.getName(1).resolveBinding(), ICPPNamespace.class); |
| assertInstance(col.getName(2).resolveBinding(), ICPPNamespace.class); |
| assertInstance(col.getName(3).resolveBinding(), ICPPClassType.class); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // #define WRAP(var) var |
| // #define MACRO 1 |
| // int a= MACRO; |
| // int b= WRAP(MACRO); |
| public void testBug94673_refsForMacrosAsArguments() throws Exception { |
| String content= getAboveComment(); |
| IASTTranslationUnit tu= parseAndCheckBindings(content, CPP, true); |
| IASTPreprocessorMacroDefinition[] defs= tu.getMacroDefinitions(); |
| assertEquals(2, defs.length); |
| IASTPreprocessorMacroDefinition md= defs[1]; |
| assertEquals("MACRO", md.getName().toString()); |
| IMacroBinding binding= (IMacroBinding) md.getName().resolveBinding(); |
| assertNotNull(binding); |
| IASTName[] refs= tu.getReferences(binding); |
| assertEquals(2, refs.length); |
| IASTFileLocation loc= refs[1].getFileLocation(); |
| final int idx = content.indexOf("WRAP(MACRO)"); |
| assertEquals(idx, loc.getNodeOffset()); |
| IASTImageLocation iloc= refs[1].getImageLocation(); |
| assertEquals(idx+5, iloc.getNodeOffset()); |
| } |
| |
| // void OSi_Panic(const char *file, int line) {}; |
| // void OSi_Panic(const char *file, int line, const char *fmt, ...) {}; |
| // |
| // #define ASSERT(exp, args...)\ |
| // {\ |
| // if (!(exp))\ |
| // {\ |
| // OSi_Panic(__FILE__, __LINE__, ##args);\ |
| // }\ |
| // }\ |
| // |
| // int main() |
| // { |
| // int a = 0; |
| // int b = 0; |
| // ASSERT(a > b, "Error: a=%d, b=%d", a, b);// marked with error |
| // ASSERT(a > b, "Error!");// marked with error also |
| // ASSERT(false);// fine |
| // } |
| |
| // void OSi_Panic(const char *file, int line) {}; |
| // void OSi_Panic(const char *file, int line, const char *fmt, ...) {}; |
| // |
| // #define ASSERT(exp, ...)\ |
| // {\ |
| // if (!(exp))\ |
| // {\ |
| // OSi_Panic(__FILE__, __LINE__, ##__VA_ARGS__);\ |
| // }\ |
| // }\ |
| // |
| // int main() |
| // { |
| // int a = 0; |
| // int b = 0; |
| // ASSERT(a > b, "Error: a=%d, b=%d", a, b);// marked with error |
| // ASSERT(a > b, "Error!");// marked with error also |
| // ASSERT(false);// fine |
| // } |
| public void testBug188855_gccExtensionForVariadicMacros() throws Exception { |
| CharSequence[] buffer = getContents(2); |
| final String content1 = buffer[0].toString(); |
| final String content2 = buffer[1].toString(); |
| parse(content1, CPP); |
| parse(content1, C); |
| parse(content2, CPP); |
| parse(content2, C); |
| } |
| |
| |
| // typedef struct Point { |
| // int x; |
| // int y; |
| // } Point ; |
| // |
| // typedef struct Tag { |
| // int tag; |
| // } Tag ; |
| // |
| // typedef struct Line { |
| // Point p1; |
| // Point p2; |
| // Tag t; |
| // } Line ; |
| // |
| // int foo() { |
| // Point p1 = {.x = 1, .y = 2}; |
| // |
| // Line l1 = {.p1 = {.x = 1, .y = 2}, {.x = 1, .y = 2}, {.tag = 5}}; |
| // Line l2 = {.t.tag = 9, .p1.x = 1, .p2.x = 3, .p1.y = 4, .p2.y = 9}; |
| // |
| // Point points[] = {{.x=1, .y=1}, {.x=2, .y=2}}; |
| // } |
| public void _testBug210019_nestedDesignatedInitializers() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), C); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| // Point p1 |
| assertField(col.getName(18).resolveBinding(), "x", "Point"); |
| assertField(col.getName(19).resolveBinding(), "y", "Point"); |
| |
| // Line l1 |
| assertField(col.getName(22).resolveBinding(), "p1", "Line"); |
| assertField(col.getName(23).resolveBinding(), "x", "Point"); |
| assertField(col.getName(24).resolveBinding(), "y", "Point"); |
| assertField(col.getName(25).resolveBinding(), "x", "Point"); |
| assertField(col.getName(26).resolveBinding(), "y", "Point"); |
| assertField(col.getName(27).resolveBinding(), "tag", "Tag"); |
| |
| // Line l2 |
| assertField(col.getName(30).resolveBinding(), "t", "Line"); |
| assertField(col.getName(31).resolveBinding(), "tag", "Tag"); |
| assertField(col.getName(32).resolveBinding(), "p1", "Line"); |
| assertField(col.getName(33).resolveBinding(), "x", "Point"); |
| assertField(col.getName(34).resolveBinding(), "p2", "Line"); |
| assertField(col.getName(35).resolveBinding(), "x", "Point"); |
| assertField(col.getName(36).resolveBinding(), "p1", "Line"); |
| assertField(col.getName(37).resolveBinding(), "y", "Point"); |
| assertField(col.getName(38).resolveBinding(), "p2", "Line"); |
| assertField(col.getName(39).resolveBinding(), "y", "Point"); |
| |
| // Point points[] |
| assertField(col.getName(42).resolveBinding(), "x", "Point"); |
| assertField(col.getName(43).resolveBinding(), "y", "Point"); |
| assertField(col.getName(44).resolveBinding(), "x", "Point"); |
| assertField(col.getName(45).resolveBinding(), "y", "Point"); |
| } |
| |
| |
| // struct S1 { |
| // int i; |
| // float f; |
| // int a[2]; |
| // }; |
| // |
| // struct S1 x = { |
| // .f=3.1, |
| // .i=2, |
| // .a[1]=9 |
| // }; |
| // |
| // struct S2 { |
| // int x, y; |
| // }; |
| // |
| // struct S2 a1[3] = {1, 2, 3, 4, 5, 6}; |
| // |
| // struct S2 a2[3] = |
| // {{1, 2},{3, 4}, 5, 6}; |
| // |
| // struct S2 a3[3] = |
| // { |
| // [2].y=6, [2].x=5, |
| // [1].y=4, [1].x=3, |
| // [0].y=2, [0].x=1 |
| // }; |
| // |
| // struct S2 a4[3] = |
| // { |
| // [0].x=1, [0].y=2, |
| // {.x=3, .y=4}, |
| // 5, [2].y=6 |
| // }; |
| // |
| // struct S2 a5[3] = |
| // { |
| // [2].x=5, 6, |
| // [0].x=1, 2, |
| // 3, 4 |
| // }; |
| public void testBug210019_designatedInitializers() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), C); |
| assertTrue(tu.isFrozen()); |
| for (int i = 0; i < NUM_TESTS; i++) { |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| |
| assertField(col.getName(6).resolveBinding(), "f", "S1"); |
| assertField(col.getName(7).resolveBinding(), "i", "S1"); |
| assertField(col.getName(8).resolveBinding(), "a", "S1"); |
| |
| assertField(col.getName(18).resolveBinding(), "y", "S2"); |
| assertField(col.getName(19).resolveBinding(), "x", "S2"); |
| assertField(col.getName(20).resolveBinding(), "y", "S2"); |
| assertField(col.getName(21).resolveBinding(), "x", "S2"); |
| assertField(col.getName(22).resolveBinding(), "y", "S2"); |
| assertField(col.getName(23).resolveBinding(), "x", "S2"); |
| |
| assertField(col.getName(26).resolveBinding(), "x", "S2"); |
| assertField(col.getName(27).resolveBinding(), "y", "S2"); |
| assertField(col.getName(28).resolveBinding(), "x", "S2"); |
| assertField(col.getName(29).resolveBinding(), "y", "S2"); |
| assertField(col.getName(30).resolveBinding(), "y", "S2"); |
| |
| assertField(col.getName(33).resolveBinding(), "x", "S2"); |
| assertField(col.getName(34).resolveBinding(), "x", "S2"); |
| |
| tu = validateCopy(tu); |
| } |
| } |
| |
| // extern "C" { |
| // extern "C" { |
| // void externFunc(); |
| // } |
| // } |
| // void test() { |
| // externFunc(); |
| // } |
| public void testBug183126_nestedLinkageSpecs() throws Exception { |
| parseAndCheckBindings(getAboveComment(), CPP); |
| } |
| |
| // int* i= 0; |
| // void f1(const int**); |
| // void f2(int *const*); |
| // void f3(const int *const*); |
| // |
| // void test() { |
| // f1(&i); // forbidden |
| // f2(&i); // ok |
| // f3(&i); // ok |
| // } |
| public void testBug213029_cvConversion() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), CPP, false); |
| NameCollector col = new NameCollector(); |
| tu.accept(col); |
| for (Object o : col.nameList) { |
| IASTName n = (IASTName) o; |
| if (n.isReference() && "f1".equals(n.toString())) |
| assertTrue(n.resolveBinding() instanceof IProblemBinding); |
| else |
| assertFalse(n.resolveBinding() instanceof IProblemBinding); |
| } |
| } |
| |
| // void isTrue(int field, int bit) { |
| // return ((field) & (bit)); |
| // } |
| // void test() { |
| // int foux=0, bhar=0; |
| // foux = (foux) - bhar1; |
| // } |
| public void testBug100641_106279_castAmbiguity() throws Exception { |
| boolean cpp= false; |
| do { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), cpp); |
| ba.assertNonProblem("field)", 5); |
| ba.assertNonProblem("bit))", 3); |
| ba.assertNonProblem("foux)", 4); |
| cpp= !cpp; |
| } while (cpp); |
| } |
| |
| // void f1(int& r) {} |
| // void f2(const int& r) {} |
| // void f3(volatile int& r) {} |
| // void f4(const volatile int& r) {} |
| // |
| // void ref() { |
| // int i= 1; |
| // const int ci= 1; |
| // volatile int vi= 2; |
| // const volatile int cvi = 3; |
| // |
| // f1(i); |
| // f1(ci); // should be an error |
| // f1(vi); // should be an error |
| // f1(cvi); // should be an error |
| // |
| // f2(i); |
| // f2(ci); |
| // f2(vi); // should be an error |
| // f2(cvi); // should be an error |
| // |
| // f3(i); |
| // f3(ci); // should be an error |
| // f3(vi); |
| // f3(cvi); // should be an error |
| // |
| // f4(i); |
| // f4(ci); |
| // f4(vi); |
| // f4(cvi); |
| // } |
| public void testBug222418_a() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f1(i)",2); |
| ba.assertProblem("f1(ci)", 2); |
| ba.assertProblem("f1(vi)", 2); |
| ba.assertProblem("f1(cvi)", 2); |
| |
| ba.assertNonProblem("f2(i)", 2); |
| ba.assertNonProblem("f2(ci)",2); |
| ba.assertProblem("f2(vi)", 2); |
| ba.assertProblem("f2(cvi)", 2); |
| |
| ba.assertNonProblem("f3(i)", 2); |
| ba.assertProblem("f3(ci)", 2); |
| ba.assertNonProblem("f3(vi)",2); |
| ba.assertProblem("f3(cvi)", 2); |
| |
| ba.assertNonProblem("f4(i)", 2); |
| ba.assertNonProblem("f4(ci)", 2); |
| ba.assertNonProblem("f4(vi)", 2); |
| ba.assertNonProblem("f4(cvi)",2); |
| } |
| |
| // void f1(int& r) {} // 1 |
| // void f1(const int& r) {} // 2 |
| // void f1(volatile int& r) {} // 3 |
| // void f1(const volatile int& r) {} // 4 |
| // |
| // void ref() { |
| // int i= 1; |
| // const int ci= 1; |
| // volatile int vi= 2; |
| // const volatile int cvi = 3; |
| // |
| // f1(i); // (1) |
| // f1(ci); // (2) |
| // f1(vi); // (3) |
| // f1(cvi); // (4) |
| // } |
| public void testBug222418_b() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| |
| ICPPFunction f1_1= ba.assertNonProblem("f1(i)", 2, ICPPFunction.class); |
| ICPPFunction f1_2= ba.assertNonProblem("f1(ci)", 2, ICPPFunction.class); |
| ICPPFunction f1_3= ba.assertNonProblem("f1(vi)", 2, ICPPFunction.class); |
| ICPPFunction f1_4= ba.assertNonProblem("f1(cvi)",2, ICPPFunction.class); |
| |
| assertEquals(ASTTypeUtil.getParameterTypeString(f1_1.getType()), "(int &)"); |
| assertEquals(ASTTypeUtil.getParameterTypeString(f1_2.getType()), "(const int &)"); |
| assertEquals(ASTTypeUtil.getParameterTypeString(f1_3.getType()), "(volatile int &)"); |
| assertEquals(ASTTypeUtil.getParameterTypeString(f1_4.getType()), "(const volatile int &)"); |
| } |
| |
| // void f1(int r) {} // 1 |
| // void f1(const int r) {} // 2 |
| // void f1(volatile int r) {} // 3 |
| // void f1(const volatile int r) {} // 4 |
| public void testBug222418_b_regression() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f1(int", 2, ICPPFunction.class); |
| ba.assertProblem("f1(const i", 2); |
| ba.assertProblem("f1(vol", 2); |
| ba.assertProblem("f1(const v",2); |
| } |
| |
| // void fa(int& r) {} |
| // void fb(const int& r) {} |
| // void fc(volatile int& r) {} |
| // void fd(const volatile int& r) {} |
| // |
| // int five() { return 5; } |
| // |
| // void ref() { |
| // fa(5); // should be an error |
| // fb(5); // ok |
| // fc(5); // should be an error |
| // fd(5); // should be an error |
| // |
| // fb(five()); // ok |
| // fa(five()); // should be an error |
| // fc(five()); // should be an error |
| // fd(five()); // should be an error |
| // } |
| public void testBug222418_c() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| |
| ICPPFunction fn= ba.assertNonProblem("five() {", 4, ICPPFunction.class); |
| assertFalse(fn.getType().getReturnType() instanceof IProblemBinding); |
| |
| ba.assertProblem("fa(5", 2); |
| ICPPFunction fb= ba.assertNonProblem("fb(5", 2, ICPPFunction.class); |
| ba.assertProblem("fc(5", 2); |
| ba.assertProblem("fd(5",2); |
| |
| ICPPFunction fb2= ba.assertNonProblem("fb(f", 2, ICPPFunction.class); |
| ba.assertProblem("fa(f",2); |
| ba.assertProblem("fc(f",2); |
| ba.assertProblem("fd(f",2); |
| |
| assertEquals(ASTTypeUtil.getParameterTypeString(fb.getType()), "(const int &)"); |
| assertEquals(ASTTypeUtil.getParameterTypeString(fb2.getType()), "(const int &)"); |
| } |
| |
| // class X { |
| // public: |
| // X(int x) {} |
| // }; |
| // |
| // void f_const(const X& x) {} |
| // void f_nonconst(X& x) {} |
| // |
| // void ref() { |
| // f_const(2); // ok |
| // f_nonconst(2); // should be an error |
| // } |
| public void testBug222418_d() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f_const(2", 7, ICPPFunction.class); |
| ba.assertProblem("f_nonconst(2", 10); |
| } |
| |
| // class A {}; |
| // |
| // void f1(A& r) {} |
| // void f2(const A& r) {} |
| // void f3(volatile A& r) {} |
| // void f4(const volatile A& r) {} |
| // |
| // void ref() { |
| // A i= *new A(); |
| // const A ci= *new A(); |
| // volatile A vi= *new A(); |
| // const volatile A cvi = *new A(); |
| // |
| // f1(i); |
| // f1(ci); // should be an error |
| // f1(vi); // should be an error |
| // f1(cvi); // should be an error |
| // |
| // f2(i); |
| // f2(ci); |
| // f2(vi); // should be an error |
| // f2(cvi); // should be an error |
| // |
| // f3(i); |
| // f3(ci); // should be an error |
| // f3(vi); |
| // f3(cvi); // should be an error |
| // |
| // f4(i); |
| // f4(ci); |
| // f4(vi); |
| // f4(cvi); |
| // } |
| public void testBug222418_e() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f1(i)",2); |
| ba.assertProblem("f1(ci)", 2); |
| ba.assertProblem("f1(vi)", 2); |
| ba.assertProblem("f1(cvi)", 2); |
| |
| ba.assertNonProblem("f2(i)", 2); |
| ba.assertNonProblem("f2(ci)",2); |
| ba.assertProblem("f2(vi)", 2); |
| ba.assertProblem("f2(cvi)", 2); |
| |
| ba.assertNonProblem("f3(i)", 2); |
| ba.assertProblem("f3(ci)", 2); |
| ba.assertNonProblem("f3(vi)",2); |
| ba.assertProblem("f3(cvi)", 2); |
| |
| ba.assertNonProblem("f4(i)", 2); |
| ba.assertNonProblem("f4(ci)", 2); |
| ba.assertNonProblem("f4(vi)", 2); |
| ba.assertNonProblem("f4(cvi)",2); |
| } |
| |
| // class B {}; |
| // |
| // class A { |
| // public: |
| // A() {} |
| // A(const A&) {} |
| // A(int i) {} |
| // A(B b, int i=5) {} |
| // }; |
| // |
| // class C { |
| // public: |
| // C() {} |
| // operator A&() {return *new A();} |
| // }; |
| // |
| // class D { |
| // public: |
| // D() {} |
| // operator A() {return *new A();} |
| // }; |
| // |
| // |
| // void foo1(A a) {} |
| // void foo2(A& a) {} |
| // |
| // int refs() { |
| // A a; |
| // B b; |
| // C c; |
| // D d; |
| // |
| // foo1(a); |
| // foo2(a); // not copied |
| // |
| // foo1(3); |
| // foo2(4); // should be an error (222418) |
| // |
| // foo1(A(5)); |
| // foo2(A(6)); // should be an error (222418) |
| // |
| // foo1(c); |
| // foo2(c); |
| // |
| // foo1(d); |
| // foo2(d); // should be an error |
| // |
| // foo1(b); |
| // foo2(b); // should be an error |
| // |
| // return 0; |
| // } |
| public void testBug222418_f() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("foo1(a)", 4); |
| ba.assertNonProblem("foo2(a)", 4); |
| ba.assertNonProblem("foo1(3)", 4); |
| ba.assertProblem("foo2(4)", 4); |
| ba.assertNonProblem("foo1(A(", 4); |
| ba.assertProblem("foo2(A(", 4); |
| ba.assertNonProblem("foo1(c)", 4); |
| ba.assertNonProblem("foo2(c)", 4); |
| ba.assertNonProblem("foo1(d)", 4); |
| ba.assertProblem("foo2(d)", 4); |
| ba.assertNonProblem("foo1(b)", 4); |
| ba.assertProblem("foo2(b)", 4); |
| } |
| |
| |
| // class A {}; |
| // class B : public A {}; |
| // |
| // void f(const A) {} |
| // void ref() { |
| // B b; |
| // const B& b2= b; |
| // f(b2); |
| // } |
| public void testBug222418_g_regression() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f(b2)", 1); |
| } |
| |
| // void f(int &i) {} |
| // void ref() { |
| // int a=3; |
| // int& r= a; |
| // f(r); |
| // } |
| public void testBug222418_h_regression() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f(r)", 1); |
| } |
| |
| // class A {}; |
| // class B : public A {}; |
| // void f(A &a) {} |
| // void ref() { |
| // B b; |
| // B& b2= b; |
| // f(b2); |
| // } |
| public void testBug222418_i_regression() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("f(b2)", 1); |
| } |
| |
| // // test adapted from IndexNamesTests.testReadWriteFlagsCpp() |
| // |
| // int ri, wi, rwi, ridebug; |
| // int* rp; int* wp; int* rwp; |
| // int* const rpc= 0; |
| // const int * const rcpc= 0; |
| // void fi(int); |
| // void fp(int*); |
| // void fr(int&); |
| // void fcp(const int*); |
| // void fcr(const int&); |
| // void fpp(int**); |
| // void fpr(int*&); |
| // void fcpp(int const**); |
| // void fcpr(int const*&); |
| // void fpcp(int *const*); |
| // void fpcr(int *const&); |
| // void fcpcp(int const *const*); |
| // void fcpcr(int const *const&); |
| // |
| // int test() { |
| // fi(ri); fp(&rwi); fcp(&ri); |
| // fi(*rp); fp(rp); fcp(rp); fpp(&rwp); fpcp(&rpc); fcpcp(&rcpc); |
| // fr(rwi); fcr(ri); |
| // fpcr(&rwi); fcpcr(&ri); |
| // fpr(rwp); fpcr(rp); fcpcr(rp); |
| // |
| // fcpp(&rwp); // should be error |
| // fpr(&rwi); // should be error |
| // fcpr(&ridebug); // should be error |
| // fcpr(rwp); // should be error |
| // |
| // return ri; |
| // } |
| public void testBug222418_j() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| |
| ba.assertNonProblem("fi(ri)", 2); |
| ba.assertNonProblem("fp(&rwi)", 2); |
| ba.assertNonProblem("fcp(&ri)", 3); |
| |
| ba.assertNonProblem("fi(*rp)", 2); |
| ba.assertNonProblem("fp(rp)", 2); |
| ba.assertNonProblem("fcp(rp)", 3); |
| ba.assertNonProblem("fpp(&rwp)", 3); |
| ba.assertNonProblem("fpcp(&rpc)", 4); |
| ba.assertNonProblem("fcpcp(&rcpc)", 5); |
| |
| ba.assertNonProblem("fr(rwi)", 2); |
| ba.assertNonProblem("fcr(ri)", 3); |
| |
| ba.assertNonProblem("fpcr(&rwi)", 4); |
| ba.assertNonProblem("fcpcr(&ri)", 5); |
| |
| ba.assertNonProblem("fpr(rwp)", 3); |
| ba.assertNonProblem("fpcr(rp)", 4); |
| ba.assertNonProblem("fcpcr(rp)", 5); |
| |
| ba.assertProblem("fcpp(&rwp)", 4); |
| ba.assertProblem("fpr(&rwi)", 3); |
| ba.assertProblem("fcpr(&ridebug)", 4); |
| ba.assertProblem("fcpr(rwp)", 4); |
| } |
| |
| // class A { |
| // public: |
| // void foo() {} |
| // void foo() const {} |
| // }; |
| // void ref() { |
| // A a; |
| // a.foo(); |
| // } |
| public void testBug222418_k_regression() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ba.assertNonProblem("foo();", 3); |
| } |
| |
| // class B {}; |
| // |
| // class C { |
| // public: |
| // operator const B() const { return *new B();} |
| // }; |
| // |
| // void foo(B b) {} |
| // |
| // void refs() { |
| // const C c= *new C(); |
| // const B b= *new B(); |
| // |
| // foo(b); |
| // foo(c); |
| // } |
| public void testBug222444_a() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ICPPFunction foo1= ba.assertNonProblem("foo(b", 3, ICPPFunction.class); |
| ICPPFunction foo2= ba.assertNonProblem("foo(c", 3, ICPPFunction.class); |
| } |
| |
| // class A {}; |
| // class B : public A {}; |
| // |
| // class C { |
| // public: |
| // operator const B() { return *new B();} |
| // }; |
| // |
| // void foo(A a) {} |
| // |
| // void refs() { |
| // C c= *new C(); |
| // |
| // foo(c); |
| // } |
| public void testBug222444_b() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ICPPFunction foo2= ba.assertNonProblem("foo(c", 3, ICPPFunction.class); |
| } |
| |
| // class A {}; |
| // class B : public A {}; |
| // |
| // class C { |
| // public: |
| // operator const B&() { return *new B();} |
| // }; |
| // |
| // void foo(A a) {} |
| // |
| // void refs() { |
| // C c= *new C(); |
| // |
| // foo(c); |
| // } |
| public void testBug222444_c() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| ICPPFunction foo2= ba.assertNonProblem("foo(c", 3, ICPPFunction.class); |
| } |
| |
| // int a, b, c; |
| // void test() { |
| // a= b ? : c; |
| // } |
| public void testOmittedPositiveExpression_212905() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // #define __inline__ __inline__ __attribute__((always_inline)) |
| // typedef int __u32; |
| // static __inline__ __u32 f(int x) { |
| // return x; |
| // } |
| public void testRedefinedGCCKeywords_226112() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // int foo asm ("myfoo") __attribute__((__used__)), ff asm("ss") = 2; |
| // extern void func () asm ("FUNC") __attribute__((__used__)); |
| public void testASMLabels_226121() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void test() { |
| // ({1;}) != 0; |
| // } |
| public void testCompoundStatementExpression_226274() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // int main() { |
| // (typeof(({ 0; }))) 0; |
| // } |
| public void testTypeofStatementExpressionInCastExpression_427950() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void test(int count) { |
| // __typeof__(count) a= 1; |
| // int ret0 = ((__typeof__(count)) 1); |
| // } |
| public void testTypeofUnaryExpression_226492() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void test(int count) { |
| // typeof(count==1) a= 1; |
| // } |
| public void testTypeofExpression_226492() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void func() { |
| // typeof(__attribute__((regparm(3)))void (*)(int *)) a; |
| // } |
| public void testTypeofExpressionWithAttribute_226492() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // struct test { |
| // int field; |
| // }; |
| // |
| // int main() { |
| // struct test t; |
| // const typeof(t) x; |
| // x.field; |
| // } |
| public void testTypeofInsideQualifier_471907() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // void test(int count) { |
| // switch(count) { |
| // case 1 ... 3: break; |
| // } |
| // } |
| public void testCaseRange_211882() throws Exception { |
| final String code = getAboveComment(); |
| { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, C, true); |
| IASTCompoundStatement body = (IASTCompoundStatement)((IASTFunctionDefinition) tu.getDeclarations()[0]).getBody(); |
| IASTSwitchStatement switchStmt = (IASTSwitchStatement) body.getStatements()[0]; |
| IASTCaseStatement caseStmt = (IASTCaseStatement)((IASTCompoundStatement) switchStmt.getBody()).getStatements()[0]; |
| IASTBinaryExpression binExpr = (IASTBinaryExpression) caseStmt.getExpression(); |
| assertTrue(binExpr.getOperator() == IASTBinaryExpression.op_ellipses); |
| assertTrue(binExpr.getOperand1() instanceof IASTLiteralExpression); |
| assertTrue(binExpr.getOperand2() instanceof IASTLiteralExpression); |
| } |
| { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, CPP, true); |
| IASTCompoundStatement body = (IASTCompoundStatement)((IASTFunctionDefinition) tu.getDeclarations()[0]).getBody(); |
| IASTSwitchStatement switchStmt = (IASTSwitchStatement) body.getStatements()[0]; |
| IASTCaseStatement caseStmt = (IASTCaseStatement)((IASTCompoundStatement) switchStmt.getBody()).getStatements()[0]; |
| IASTBinaryExpression binExpr = (IASTBinaryExpression) caseStmt.getExpression(); |
| assertTrue(binExpr.getOperator() == IASTBinaryExpression.op_ellipses); |
| assertTrue(binExpr.getOperand1() instanceof IASTLiteralExpression); |
| assertTrue(binExpr.getOperand2() instanceof IASTLiteralExpression); |
| } |
| } |
| |
| // typedef int* TIntPtr; |
| // int x(int (int * a)); |
| // int x(int(TIntPtr)); |
| public void testInfiniteRecursion_269052() throws Exception { |
| final String code= getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // template<typename T> class X { |
| // typename T::t func() { |
| // return typename T::t(); |
| // } |
| // }; |
| public void testTypenameInExpression() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // struct __attribute__((declspec)) bla; |
| public void testAttributeInElaboratedTypeSpecifier_227085() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // struct X; |
| // void test(struct X* __restrict result); |
| public void testRestrictReference_227110() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // char buf[256]; |
| // int x= sizeof(buf)[0]; |
| public void testSizeofUnaryWithParenthesis_227122() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // class X { |
| // public: |
| // void* operator new(unsigned int sz, char* buf) {return buf;} |
| // }; |
| // |
| // char* buffer; |
| // void test1() { |
| // X* it = buffer == 0 ? new (buffer) X : 0; |
| // } |
| public void testPlacementNewInConditionalExpression_227104() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // int f(x) { |
| // return 0; |
| // } |
| public void testBug228422_noKnrParam() throws Exception { |
| CharSequence buffer = getContents(1)[0]; |
| parse(buffer.toString(), C, false); |
| } |
| |
| // struct { |
| // char foo; |
| // } myStruct, *myStructPointer; |
| // |
| // union { |
| // char foo; |
| // } myUnion, *myUnionPointer; |
| // |
| // void test() { |
| // myStruct.foo=1; |
| // myStructPointer->foo=2; |
| // myUnion.foo=3; |
| // myUnionPointer->foo=4; |
| // |
| // myStruct.bar=1; |
| // myStructPointer->bar=2; |
| // myUnion.bar=3; |
| // myUnionPointer->bar=4; |
| // } |
| public void testBug228504_nonExistingMembers() throws Exception { |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), lang); |
| for (int i= 1; i < 5; i++) { |
| ba.assertNonProblem("foo=" + i, 3); |
| ba.assertProblem("bar=" + i, 3); |
| } |
| } |
| } |
| |
| // struct S { |
| // int value; |
| // }; |
| // typedef struct S *PtrS; |
| // struct T { |
| // PtrS ptrS; |
| // }; |
| // |
| // void testint(int x); |
| // void testptr(struct T* x); |
| // |
| // void test() { |
| // struct T* t; |
| // t->ptrS->value; |
| // (t->ptrS+1)->value; |
| // testptr(t-0); |
| // testint(t-t); |
| // testint(0-t); |
| // } |
| public void testTypeOfPointerOperations() throws Exception { |
| String code= getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // int globalArray[4] = {1,2,3,4}; |
| // void function1(); // decl |
| // |
| // void function1() { |
| // getArray()[0] = 1; |
| // } |
| // |
| // void function2() { |
| // function1(); // ref |
| // } |
| public void testOutOfOrderResolution_232300() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| IBinding b1= ba.assertNonProblem("function1(); // decl", 9); |
| IBinding b2= ba.assertNonProblem("function1() {", 9); |
| IBinding b3= ba.assertNonProblem("function1(); // ref", 9); |
| assertSame(b1, b2); |
| assertSame(b2, b3); |
| } |
| } |
| |
| // #define foo __typeof__((int*)0 - (int*)0) |
| // typedef foo ptrdiff_t; |
| public void testRedefinePtrdiff_230895() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| IBinding b1= ba.assertNonProblem("ptrdiff_t", 9); |
| assertInstance(b1, ITypedef.class); |
| ITypedef td= (ITypedef) b1; |
| IType t= td.getType(); |
| assertFalse(t instanceof ITypedef); |
| } |
| } |
| |
| // int a; |
| // int b= a; // ref |
| // struct S; |
| // typedef struct S S; // td |
| public void testRedefineStructInScopeThatIsFullyResolved() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| ba.assertNonProblem("a; // ref", 1); |
| // now scope is fully resolved |
| ICompositeType ct= ba.assertNonProblem("S;", 1, ICompositeType.class); |
| ITypedef td= ba.assertNonProblem("S; // td", 1, ITypedef.class); |
| IType t= td.getType(); |
| assertFalse(t instanceof IProblemBinding); |
| assertSame(t, ct); |
| } |
| } |
| |
| // void checkLong(long); |
| // void test() { |
| // checkLong(__builtin_expect(1, 1)); |
| // } |
| public void testReturnTypeOfBuiltin_234309() throws Exception { |
| String code= getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // typedef void VOID; |
| // VOID func(void) { |
| // } |
| public void testTypedefVoid_221567() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| ITypedef td= ba.assertNonProblem("VOID;", 4, ITypedef.class); |
| |
| IFunction func= ba.assertNonProblem("func", 4, IFunction.class); |
| IFunctionType ft= func.getType(); |
| IType rt= ft.getReturnType(); |
| IType[] pts= ft.getParameterTypes(); |
| assertEquals(0, pts.length); |
| assertInstance(rt, ITypedef.class); |
| rt= ((ITypedef) rt).getType(); |
| |
| assertTrue(rt instanceof IBasicType); |
| assertEquals(IBasicType.Kind.eVoid, ((IBasicType) rt).getKind()); |
| } |
| } |
| |
| // #define str(s) # s |
| // |
| // void foo() { |
| // printf(str(this is a // this should go away |
| // string)); |
| // } |
| public void testCommentInExpansion_84276() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment()); |
| IASTFunctionDefinition func= (IASTFunctionDefinition) tu.getDeclarations()[0]; |
| |
| IASTFunctionCallExpression fcall= (IASTFunctionCallExpression) ((IASTExpressionStatement)((IASTCompoundStatement) func.getBody()).getStatements()[0]).getExpression(); |
| IASTLiteralExpression lit= (IASTLiteralExpression) fcall.getArguments()[0]; |
| assertEquals("\"this is a string\"", lit.toString()); |
| } |
| |
| // typedef int tint; |
| // tint f1(tint (tint)); |
| // int f2(int (int)); |
| // int f3(int (tint)); |
| // int f4(int (identifier)); |
| // int f5(int *(tint[10])); |
| public void testParamWithFunctionType_84242() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(comment, lang); |
| |
| IFunction f= ba.assertNonProblem("f1", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (int (*)(int))"); |
| |
| f= ba.assertNonProblem("f2", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (int (*)(int))"); |
| |
| f= ba.assertNonProblem("f3", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (int (*)(int))"); |
| |
| f= ba.assertNonProblem("f4", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (int)"); |
| |
| f= ba.assertNonProblem("f5", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (int * (*)(int *))"); |
| } |
| } |
| |
| // class C { }; |
| // void f1(int(C)) { } |
| public void testParamWithFunctionTypeCpp_84242() throws Exception { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true); |
| |
| IFunction f= ba.assertNonProblem("f1", 2, IFunction.class); |
| isTypeEqual(f.getType(), "void (int (*)(C))"); |
| } |
| |
| // int (*f1(int par))[5] {}; |
| // int (*f1 (int par))[5]; |
| public void testFunctionReturningPtrToArray_216609() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), lang); |
| |
| IFunction f= ba.assertNonProblem("f1", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (* (int))[5]"); |
| |
| f= ba.assertNonProblem("f1 ", 2, IFunction.class); |
| isTypeEqual(f.getType(), "int (* (int))[5]"); |
| } |
| } |
| |
| // void f1() {} |
| // void (f2)() {} |
| // void (f3()) {} |
| // void ((f4)()) {} |
| // void f1(); |
| // void (f2)(); |
| // void (f3()); |
| // void ((f4)()); |
| public void testNestedFunctionDeclarators() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(comment, lang); |
| IASTFunctionDefinition fdef= getDeclaration(tu, 0); |
| IASTDeclarator dtor= fdef.getDeclarator(); |
| assertNull(dtor.getNestedDeclarator()); |
| assertInstance(dtor.getParent(), IASTFunctionDefinition.class); |
| assertInstance(dtor.getName().resolveBinding(), IFunction.class); |
| |
| fdef= getDeclaration(tu, 1); |
| dtor= fdef.getDeclarator(); |
| assertNotNull(dtor.getNestedDeclarator()); |
| assertInstance(dtor.getParent(), IASTFunctionDefinition.class); |
| assertInstance(dtor.getNestedDeclarator().getName().resolveBinding(), IFunction.class); |
| |
| fdef= getDeclaration(tu, 2); |
| dtor= fdef.getDeclarator(); |
| assertNull(dtor.getNestedDeclarator()); |
| assertInstance(dtor.getParent().getParent(), IASTFunctionDefinition.class); |
| assertInstance(dtor.getName().resolveBinding(), IFunction.class); |
| |
| fdef= getDeclaration(tu, 3); |
| dtor= fdef.getDeclarator(); |
| assertNotNull(dtor.getNestedDeclarator()); |
| assertInstance(dtor.getParent().getParent(), IASTFunctionDefinition.class); |
| assertInstance(dtor.getNestedDeclarator().getName().resolveBinding(), IFunction.class); |
| |
| IASTSimpleDeclaration sdef= getDeclaration(tu, 4); |
| IBinding binding= sdef.getDeclarators()[0].getName().resolveBinding(); |
| assertInstance(binding, IFunction.class); |
| assertEquals(2, tu.getDeclarationsInAST(binding).length); |
| |
| sdef= getDeclaration(tu, 5); |
| binding= sdef.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding(); |
| assertInstance(binding, IFunction.class); |
| assertEquals(2, tu.getDeclarationsInAST(binding).length); |
| |
| sdef= getDeclaration(tu, 6); |
| binding= sdef.getDeclarators()[0].getNestedDeclarator().getName().resolveBinding(); |
| assertInstance(binding, IFunction.class); |
| assertEquals(2, tu.getDeclarationsInAST(binding).length); |
| |
| sdef= getDeclaration(tu, 7); |
| binding= sdef.getDeclarators()[0].getNestedDeclarator().getNestedDeclarator().getName().resolveBinding(); |
| assertInstance(binding, IFunction.class); |
| assertEquals(2, tu.getDeclarationsInAST(binding).length); |
| } |
| } |
| |
| // void f() { |
| // int a,b; |
| // { b; a; int a; } |
| // } |
| public void testLocalVariableResolution_235831() throws Exception { |
| final String comment= getAboveComment(); |
| final boolean[] isCpps= {false, true}; |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(comment, lang); |
| |
| ba.assertNonProblem("b; a", 1, IVariable.class); // fill cache of inner block |
| IVariable v3= ba.assertNonProblem("a; }", 1, IVariable.class); |
| IVariable v2= ba.assertNonProblem("a; int", 1, IVariable.class); |
| IVariable v1= ba.assertNonProblem("a,", 1, IVariable.class); |
| assertSame(v1, v2); |
| assertNotSame(v2, v3); |
| } |
| } |
| |
| // int foo(int (*ptr) (int, int)); |
| public void testComplexParameterBinding_214482() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(comment, lang); |
| IParameter p= ba.assertNonProblem("ptr", 3, IParameter.class); |
| assertEquals("ptr", p.getName()); |
| } |
| } |
| |
| // void test() {} |
| // + |
| public void testTrailingSyntaxErrorInTU() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(comment, lang, false, false); |
| IASTDeclaration decl= getDeclaration(tu, 0); |
| IASTProblemDeclaration pdecl= getDeclaration(tu, 1); |
| assertEquals("+", pdecl.getRawSignature()); |
| } |
| } |
| |
| // struct X { |
| // int test; |
| // + |
| // }; |
| public void testTrailingSyntaxErrorInCompositeType() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(comment, lang, false, false); |
| IASTCompositeTypeSpecifier ct= getCompositeType(tu, 0); |
| IASTDeclaration decl= getDeclaration(ct, 0); |
| IASTProblemDeclaration pdecl= getDeclaration(ct, 1); |
| assertEquals("+", pdecl.getRawSignature()); |
| } |
| } |
| |
| // void func() { |
| // { |
| // int test; |
| // + |
| // } |
| // } |
| public void testTrailingSyntaxErrorInCompoundStatements() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(comment, lang, false, false); |
| IASTFunctionDefinition def= getDeclaration(tu, 0); |
| IASTCompoundStatement compStmt= getStatement(def, 0); |
| IASTDeclarationStatement dstmt= getStatement(compStmt, 0); |
| IASTProblemStatement pstmt= getStatement(compStmt, 1); |
| assertEquals("+", pstmt.getRawSignature()); |
| } |
| } |
| |
| // struct X { |
| // ; |
| // }; |
| // ; |
| public void testEmptyDeclarations() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(comment, lang, false, false); |
| IASTCompositeTypeSpecifier ct= getCompositeType(tu, 0); |
| IASTDeclaration empty= getDeclaration(ct, 0); |
| assertEquals(";", empty.getRawSignature()); |
| empty= getDeclaration(tu, 1); |
| assertEquals(";", empty.getRawSignature()); |
| } |
| } |
| |
| // void test() { |
| // int foux = 3; |
| // switch(foux) // no brace! |
| // case 0: |
| // case 1: |
| // foux= 0; |
| // foux= 1; |
| // } |
| public void testSwitchWithoutCompound_105334() throws Exception { |
| final String comment= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(comment, lang); |
| IASTFunctionDefinition fdef= getDeclaration(tu, 0); |
| IASTSwitchStatement sw= getStatement(fdef, 1); |
| IASTStatement stmt= getStatement(fdef, 2); |
| assertEquals("foux= 1;", stmt.getRawSignature()); |
| } |
| } |
| |
| // typedef int t; |
| // int a,b; |
| // void test() { |
| |
| // b* (t)+a *b // b,t,a,unary+,cast,*,b,* |
| // b*(a) + a*b // b,a,*,a,b,*,+ |
| // b* (t)-a *b // b,t,a,unary-,cast,*,b,* |
| // b*(a) - a*b // b,a,*,a,b,*,- |
| // b* (t)*a *b // b,t,a,unary*,cast,*,b,* |
| // b*(a) * a * b // b,a,*,a,*,b,* |
| // b == (t)&a < b // b,t,a,unary&,cast,b,<,== |
| // b < (t)&a == b // b,t,a,unary&,cast,<,b,== |
| // b==(a) & a<b // b,a,==,a,b,<,& |
| // +(t)+1 // t,1,unary+,cast,unary+ |
| // +(a)+1 // a,unary+,1,+ |
| // sizeof +(t)+1 // t,1,unary+,cast,unary+,sizeof |
| // sizeof +(a)+1 // a,unary+,sizeof,1,+ |
| // b* (t)(t)+a * b // b,t,t,a,unary+,cast,cast,*,b,* |
| // b* (t)(a)+a * b // b,t,a,cast,*,a,b,*,+ |
| // (int)(t)+1 // int,t,1,unary+,cast,cast |
| // (int)(a)+1 // int,a,cast,1,+ |
| // a*a*(t)+a*a*a // a,a,*,t,a,unary+,cast,*,a,*,a,* |
| // (typeof a)(t)-a // typeof a,t,a,unary-,cast,cast |
| // (typeof a)(a)-a // typeof a,a,cast,a,- |
| public void testBinaryVsCastAmbiguities_237057() throws Exception { |
| CharSequence[] input= getContents(2); |
| String code= input[0].toString(); |
| String[] samples= input[1].toString().split("\n"); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| for (String s : samples) { |
| final String[] io= s.split("//"); |
| final String exprStr = io[0].trim(); |
| final IASTTranslationUnit tu= parse(code + exprStr + ";}", lang); |
| final IASTFunctionDefinition fdef= getDeclaration(tu, 2); |
| IASTExpression expr= getExpressionOfStatement(fdef, 0); |
| assertEquals("expr: " + exprStr, io[1].trim(), polishNotation(expr)); |
| assertEquals(exprStr, expr.getRawSignature()); |
| checkOffsets(exprStr, expr); |
| } |
| } |
| } |
| |
| // struct s {int b;}; |
| // typedef int t; |
| // struct s* a; |
| // struct s* f(struct s*); |
| // void test() { |
| |
| // (t)(a) // t,a,cast |
| // (f)(a) // f,a,() |
| // (t)(t)(a) // t,t,a,cast,cast |
| // (t)(f)(a) // t,f,a,(),cast |
| // (f)(a)(a) // f,a,(),a,() |
| // (t)(f)(a)++ // t,f,a,(),++,cast |
| // (t)(t)(a)++ // t,t,a,++,cast,cast |
| // (t)(f)(a)-- // t,f,a,(),--,cast |
| // (t)(t)(a)-- // t,t,a,--,cast,cast |
| // (t)(f)(a)[0] // t,f,a,(),0,[],cast |
| // (t)(t)(a)[0] // t,t,a,0,[],cast,cast |
| // (t)(f)(a)->b // t,f,a,(),b,->,cast |
| // (t)(t)(a)->b // t,t,a,b,->,cast,cast |
| // (t)(a)+1 // t,a,cast,1,+ |
| // (f)(a)+1 // f,a,(),1,+ |
| // (t)(t)+1 // t,t,1,unary+,cast,cast |
| public void testCastVsFunctionCallAmbiguities_237057() throws Exception { |
| CharSequence[] input= getContents(2); |
| String code= input[0].toString(); |
| String[] samples= input[1].toString().split("\n"); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| for (String s : samples) { |
| final String[] io= s.split("//"); |
| final String exprStr = io[0].trim(); |
| final IASTTranslationUnit tu= parse(code + exprStr + ";}", lang); |
| final IASTFunctionDefinition fdef= getDeclaration(tu, 4); |
| IASTExpression expr= getExpressionOfStatement(fdef, 0); |
| assertEquals("expr: " + exprStr, io[1].trim(), polishNotation(expr)); |
| assertEquals(exprStr, expr.getRawSignature()); |
| checkOffsets(exprStr, expr); |
| } |
| } |
| } |
| |
| // int a,b; |
| // void test() { |
| |
| // 1+2+3 // 1,2,+,3,+ |
| // a=b=1 // a,b,1,=,= |
| // 0, a= 1 ? 2,3 : b= 4, 5 // 0,a,1,2,3,,,b,4,=,?,=,5,, |
| // 1 ? 2 ? 3 : 4 ? 5 : 6 : 7 // 1,2,3,4,5,6,?,?,7,? |
| public void testBinaryExpressionBinding() throws Exception { |
| CharSequence[] input= getContents(2); |
| String code= input[0].toString(); |
| String[] samples= input[1].toString().split("\n"); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| for (String s : samples) { |
| final String[] io= s.split("//"); |
| final String exprStr = io[0].trim(); |
| final IASTTranslationUnit tu= parse(code + exprStr + ";}", lang); |
| final IASTFunctionDefinition fdef= getDeclaration(tu, 1); |
| IASTExpression expr= getExpressionOfStatement(fdef, 0); |
| assertEquals("expr: " + exprStr, io[1].trim(), polishNotation(expr)); |
| assertEquals(exprStr, expr.getRawSignature()); |
| checkOffsets(exprStr, expr); |
| } |
| } |
| } |
| |
| // int a,b; |
| // void test(int a= |
| |
| // 1+2+3 // 1,2,+,3,+ |
| // a=b=1 // a,b,1,=,= |
| // 1 ? 2,3 : b= 4 // 1,2,3,,,b,4,=,? |
| // 1 ? 2 ? 3 : 4 ? 5 : 6 : 7 // 1,2,3,4,5,6,?,?,7,? |
| public void testConstantExpressionBinding() throws Exception { |
| CharSequence[] input= getContents(2); |
| String code= input[0].toString(); |
| String[] samples= input[1].toString().split("\n"); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| for (String s : samples) { |
| final String[] io= s.split("//"); |
| final String exprStr = io[0].trim(); |
| final IASTTranslationUnit tu= parse(code + exprStr + "){}", lang); |
| final IASTFunctionDefinition fdef= getDeclaration(tu, 1); |
| IASTFunctionDeclarator fdtor= fdef.getDeclarator(); |
| IASTParameterDeclaration pdecl= (IASTParameterDeclaration) fdtor.getChildren()[1]; |
| IASTExpression expr= (IASTExpression) ((IASTEqualsInitializer) pdecl.getDeclarator().getInitializer()).getInitializerClause(); |
| assertEquals("expr: " + exprStr, io[1].trim(), polishNotation(expr)); |
| assertEquals(exprStr, expr.getRawSignature()); |
| checkOffsets(exprStr, expr); |
| } |
| } |
| } |
| |
| |
| private void checkOffsets(String exprStr, IASTExpression expr) { |
| if (expr instanceof IASTBinaryExpression) { |
| IASTBinaryExpression bexpr= (IASTBinaryExpression) expr; |
| checkOffsets(exprStr, bexpr.getOperand1()); |
| checkOffsets(exprStr, bexpr.getOperand2()); |
| assertEquals("in expr: " + exprStr, offset(bexpr), offset(bexpr.getOperand1())); |
| assertTrue("in expr: " + exprStr, endOffset(bexpr.getOperand1()) < offset(bexpr.getOperand2())); |
| assertEquals("in expr: " + exprStr, endOffset(bexpr), endOffset(bexpr.getOperand2())); |
| } else if (expr instanceof IASTCastExpression) { |
| IASTCastExpression castExpr= (IASTCastExpression) expr; |
| checkOffsets(exprStr, castExpr.getOperand()); |
| assertTrue("in expr: " + exprStr, offset(castExpr) < offset(castExpr.getTypeId())); |
| assertTrue("in expr: " + exprStr, endOffset(castExpr.getTypeId()) < offset(castExpr.getOperand())); |
| assertEquals("in expr: " + exprStr, endOffset(castExpr), endOffset(castExpr.getOperand())); |
| } else if (expr instanceof IASTUnaryExpression) { |
| IASTUnaryExpression unaryExpr= (IASTUnaryExpression) expr; |
| checkOffsets(exprStr, unaryExpr.getOperand()); |
| switch (unaryExpr.getOperator()) { |
| case IASTUnaryExpression.op_bracketedPrimary: |
| assertTrue("in expr: " + exprStr, offset(unaryExpr) < offset(unaryExpr.getOperand())); |
| assertTrue("in expr: " + exprStr, endOffset(unaryExpr.getOperand()) < endOffset(unaryExpr)); |
| break; |
| case IASTUnaryExpression.op_postFixDecr: |
| case IASTUnaryExpression.op_postFixIncr: |
| assertEquals("in expr: " + exprStr, offset(expr), offset(unaryExpr.getOperand())); |
| assertTrue("in expr: " + exprStr, endOffset(unaryExpr.getOperand()) < endOffset(expr)); |
| break; |
| default: |
| assertTrue("in expr: " + exprStr, offset(unaryExpr) < offset(unaryExpr.getOperand())); |
| assertEquals("in expr: " + exprStr, endOffset(unaryExpr), endOffset(unaryExpr.getOperand())); |
| break; |
| } |
| } |
| } |
| |
| private int offset(IASTNode expr) { |
| return ((ASTNode) expr).getOffset(); |
| } |
| |
| private int endOffset(IASTNode expr) { |
| return ((ASTNode) expr).getOffset() + ((ASTNode) expr).getLength(); |
| } |
| |
| private String polishNotation(IASTInitializerClause expr) { |
| StringBuilder buf= new StringBuilder(); |
| polishNotation(expr, buf); |
| return buf.toString(); |
| } |
| |
| private void polishNotation(IASTInitializerClause expr, StringBuilder buf) { |
| if (expr instanceof IASTConditionalExpression) { |
| IASTConditionalExpression bexpr= (IASTConditionalExpression) expr; |
| polishNotation(bexpr.getLogicalConditionExpression(), buf); |
| buf.append(','); |
| polishNotation(bexpr.getPositiveResultExpression(), buf); |
| buf.append(','); |
| polishNotation(bexpr.getNegativeResultExpression(), buf); |
| buf.append(','); |
| buf.append('?'); |
| } else if (expr instanceof IASTExpressionList) { |
| IASTExpressionList bexpr= (IASTExpressionList) expr; |
| IASTExpression[] args = bexpr.getExpressions(); |
| for (IASTExpression e : args) { |
| polishNotation(e, buf); |
| buf.append(','); |
| } |
| buf.append(','); |
| } else if (expr instanceof IASTBinaryExpression) { |
| IASTBinaryExpression bexpr= (IASTBinaryExpression) expr; |
| polishNotation(bexpr.getOperand1(), buf); |
| buf.append(','); |
| polishNotation(bexpr.getOperand2(), buf); |
| buf.append(','); |
| buf.append(ASTStringUtil.getBinaryOperatorString(bexpr)); |
| } else if (expr instanceof IASTCastExpression) { |
| IASTCastExpression castExpr= (IASTCastExpression) expr; |
| buf.append(castExpr.getTypeId().getRawSignature()); |
| buf.append(','); |
| polishNotation(castExpr.getOperand(), buf); |
| buf.append(",cast"); |
| } else if (expr instanceof IASTFunctionCallExpression) { |
| IASTFunctionCallExpression f= (IASTFunctionCallExpression) expr; |
| polishNotation(f.getFunctionNameExpression(), buf); |
| buf.append(','); |
| for (IASTInitializerClause arg : f.getArguments()) { |
| polishNotation(arg, buf); |
| buf.append(','); |
| } |
| buf.append("()"); |
| } else if (expr instanceof IASTArraySubscriptExpression) { |
| IASTArraySubscriptExpression f= (IASTArraySubscriptExpression) expr; |
| polishNotation(f.getArrayExpression(), buf); |
| buf.append(','); |
| polishNotation(f.getArgument(), buf); |
| buf.append(",[]"); |
| } else if (expr instanceof IASTFieldReference) { |
| IASTFieldReference f= (IASTFieldReference) expr; |
| polishNotation(f.getFieldOwner(), buf); |
| buf.append(','); |
| buf.append(f.getFieldName().toString()); |
| buf.append(','); |
| buf.append(f.isPointerDereference() ? "->" : "."); |
| } else if (expr instanceof IASTUnaryExpression) { |
| IASTUnaryExpression unaryExpr= (IASTUnaryExpression) expr; |
| polishNotation(unaryExpr.getOperand(), buf); |
| switch (unaryExpr.getOperator()) { |
| case IASTUnaryExpression.op_amper: |
| case IASTUnaryExpression.op_plus: |
| case IASTUnaryExpression.op_minus: |
| case IASTUnaryExpression.op_star: |
| buf.append(",unary"); |
| buf.append(ASTStringUtil.getUnaryOperatorString(unaryExpr)); |
| break; |
| case IASTUnaryExpression.op_bracketedPrimary: |
| break; |
| default: |
| buf.append(','); |
| buf.append(ASTStringUtil.getUnaryOperatorString(unaryExpr)); |
| break; |
| } |
| } else if (expr instanceof IASTInitializerList) { |
| buf.append('{'); |
| for (IASTInitializerClause clause : ((IASTInitializerList) expr).getClauses()) { |
| polishNotation(clause, buf); |
| } |
| buf.append('}'); |
| } else { |
| buf.append(expr.getRawSignature()); |
| } |
| } |
| |
| // typedef struct { |
| // int x; |
| // } spinlock_t; |
| // spinlock_t _lock = (spinlock_t) { }; |
| public void testCompoundInitializer_145387() throws Exception { |
| // valid in C99, not in C++. |
| parseAndCheckBindings(getAboveComment(), C, true); |
| } |
| |
| // enum __declspec(uuid("uuid")) bla { a, b}; |
| public void testDeclspecInEnumSpecifier_241203() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| parseAndCheckBindings(getAboveComment(), lang, true); |
| } |
| } |
| |
| // struct Outer { |
| // struct {int a1;}; |
| // struct {int a2;} a3; |
| // }; |
| // void test() { |
| // struct Outer o; |
| // o.a1=0; o.a2=0; o.a3=0; |
| // } |
| public void testAnonymousUnionMember() throws Exception { |
| final boolean[] isCpps= {false, true}; |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), lang); |
| bh.assertNonProblem("a1=", 2); |
| bh.assertProblem("a2=", 2); |
| bh.assertNonProblem("a3=", 2); |
| } |
| } |
| |
| // void test() { |
| // char* p; |
| // if (__builtin_types_compatible_p(typeof(p), char[])) { |
| // } |
| // } |
| public void testBuiltinTypesCompatible_241570() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| parseAndCheckBindings(getAboveComment(), lang, true); |
| } |
| } |
| |
| // void alloc(const char * id) {} |
| // void test() { |
| // alloc(__func__); |
| // } |
| public void testPredefinedFunctionName_247747() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C, false); |
| parseAndCheckBindings(getAboveComment(), CPP, false); |
| } |
| |
| // void alloc(const char * id) {} |
| // void test() { |
| // alloc(__func__); |
| // alloc(__FUNCTION__); |
| // alloc(__PRETTY_FUNCTION__); |
| // } |
| public void testPredefinedFunctionNameGcc_247747() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C, true); |
| parseAndCheckBindings(getAboveComment(), CPP, true); |
| } |
| |
| // int foo = 42; |
| // typedef char StupidType; |
| // StupidType const *bar = (StupidType const*)&foo; |
| public void testUnusualDeclSpecOrdering_251514() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C, true); |
| parseAndCheckBindings(getAboveComment(), CPP, true); |
| } |
| |
| // #define IF if |
| // #define IF_P if ( |
| // #define IF_P_T if (1 |
| // #define SEMI_IF ; if |
| // #define IF_COND if (1) |
| // void test() { |
| public void testLeadingSyntax_250251() throws Exception { |
| String code= getAboveComment(); |
| |
| IASTTranslationUnit tu= parseAndCheckBindings(code + "if (1) {};}"); |
| IASTFunctionDefinition f= getDeclaration(tu, 0); |
| IASTIfStatement i = getStatement(f, 0); |
| IASTExpression x= i.getConditionExpression(); |
| IToken syntax= x.getLeadingSyntax(); |
| checkToken(syntax, "if", -4); syntax= syntax.getNext(); |
| checkToken(syntax, "(", -1); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "if( 1) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| syntax= x.getLeadingSyntax(); |
| checkToken(syntax, "if", -5); syntax= syntax.getNext(); |
| checkToken(syntax, "(", -3); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "if(1) ; else ;}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); IASTStatement est= i.getElseClause(); |
| syntax= est.getLeadingSyntax(); |
| checkToken(syntax, "else", -5); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "IF(1) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| syntax= x.getLeadingSyntax(); |
| checkToken(syntax, "IF", -3); syntax= syntax.getNext(); |
| checkToken(syntax, "(", -1); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "IF_P 1) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| syntax= x.getLeadingSyntax(); |
| checkToken(syntax, "IF_P", -5); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "IF_P_T) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| try { |
| syntax= x.getLeadingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) {} |
| |
| tu= parseAndCheckBindings(code + "SEMI_IF (1) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 1); x= i.getConditionExpression(); |
| try { |
| syntax= x.getLeadingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) {} |
| |
| tu= parseAndCheckBindings(code + "IF_COND {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| try { |
| syntax= x.getLeadingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) {} |
| } |
| |
| // #define P(x) ) |
| // #define BLOCK() {} |
| // #define T_P 1) |
| // #define P_BLOCK ){} |
| // #define IF_COND if (1) |
| // void test() { |
| public void testTrailingSyntax_250251() throws Exception { |
| String code= getAboveComment(); |
| |
| IASTTranslationUnit tu= parseAndCheckBindings(code + "if (1) {};}"); |
| IASTFunctionDefinition f= getDeclaration(tu, 0); |
| IASTIfStatement i = getStatement(f, 0); |
| IASTExpression x= i.getConditionExpression(); |
| IToken syntax= x.getTrailingSyntax(); |
| checkToken(syntax, ")", 0); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "do {} while(1 );}"); |
| f= getDeclaration(tu, 0); IASTDoStatement dstmt= getStatement(f, 0); x= dstmt.getCondition(); |
| syntax= x.getTrailingSyntax(); |
| checkToken(syntax, ")", 1); syntax= syntax.getNext(); |
| checkToken(syntax, ";", 2); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| |
| tu= parseAndCheckBindings(code + "if(1 ) BLOCK()}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| syntax= x.getTrailingSyntax(); |
| checkToken(syntax, ")", 1); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "if(1 P(0) {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| syntax= x.getTrailingSyntax(); |
| checkToken(syntax, "P", 1); syntax= syntax.getNext(); |
| checkToken(syntax, "(", 2); syntax= syntax.getNext(); |
| checkToken(syntax, "0", 3); syntax= syntax.getNext(); |
| checkToken(syntax, ")", 4); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "if (T_P {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| try { |
| syntax= x.getTrailingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) {} |
| |
| tu= parseAndCheckBindings(code + "if (1 P_BLOCK }"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| try { |
| syntax= x.getTrailingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) { |
| } |
| |
| tu= parseAndCheckBindings(code + "IF_COND {}}"); |
| f= getDeclaration(tu, 0); i= getStatement(f, 0); x= i.getConditionExpression(); |
| try { |
| syntax= x.getTrailingSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) { |
| } |
| } |
| |
| // #define IF if |
| // #define IF_P if ( |
| // #define IF_P_T if (1 |
| // #define SEMI_IF ; if |
| // #define IF_COND if (1) |
| // void test() { |
| public void testSyntax_250251() throws Exception { |
| String code= getAboveComment(); |
| |
| IASTTranslationUnit tu= parseAndCheckBindings(code + "if (1) {};}"); |
| IASTFunctionDefinition f= getDeclaration(tu, 0); |
| IASTIfStatement x = getStatement(f, 0); |
| IToken syntax= x.getSyntax(); |
| checkToken(syntax, "if", 0); syntax= syntax.getNext(); |
| checkToken(syntax, "(", 3); syntax= syntax.getNext(); |
| checkToken(syntax, "1", 4); syntax= syntax.getNext(); |
| checkToken(syntax, ")", 5); syntax= syntax.getNext(); |
| checkToken(syntax, "{", 7); syntax= syntax.getNext(); |
| checkToken(syntax, "}", 8); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "if( 1) {}}"); |
| f= getDeclaration(tu, 0); x= getStatement(f, 0); |
| syntax= x.getSyntax(); |
| checkToken(syntax, "if", 0); syntax= syntax.getNext(); |
| checkToken(syntax, "(", 2); syntax= syntax.getNext(); |
| checkToken(syntax, "1", 5); syntax= syntax.getNext(); |
| checkToken(syntax, ")", 6); syntax= syntax.getNext(); |
| checkToken(syntax, "{", 8); syntax= syntax.getNext(); |
| checkToken(syntax, "}", 9); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "IF(1) {}}"); |
| f= getDeclaration(tu, 0); x= getStatement(f, 0); |
| syntax= x.getSyntax(); |
| checkToken(syntax, "IF", 0); syntax= syntax.getNext(); |
| checkToken(syntax, "(", 2); syntax= syntax.getNext(); |
| checkToken(syntax, "1", 3); syntax= syntax.getNext(); |
| checkToken(syntax, ")", 4); syntax= syntax.getNext(); |
| checkToken(syntax, "{", 6); syntax= syntax.getNext(); |
| checkToken(syntax, "}", 7); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| tu= parseAndCheckBindings(code + "SEMI_IF (1) {}}"); |
| f= getDeclaration(tu, 0); x= getStatement(f, 1); |
| try { |
| syntax= x.getSyntax(); |
| fail(); |
| } catch (ExpansionOverlapsBoundaryException e) { |
| } |
| } |
| |
| private void checkToken(IToken token, String image, int offset) { |
| assertEquals(image, token.getImage()); |
| assertEquals(offset, token.getOffset()); |
| assertEquals(image.length(), token.getLength()); |
| } |
| |
| // void test() { |
| // int x,y; |
| // x |
| // << |
| // y; |
| // } |
| public void testSyntaxWithNL_280175() throws Exception { |
| String code= getAboveComment(); |
| int offsetX= code.indexOf('x', code.indexOf('x')+1); |
| int offsetShift= code.indexOf('<'); |
| int offsetY= code.indexOf('y', offsetX); |
| |
| IASTTranslationUnit tu= parseAndCheckBindings(code); |
| IASTFunctionDefinition f= getDeclaration(tu, 0); |
| IASTExpressionStatement i = getStatement(f, 1); |
| final IASTBinaryExpression expr = (IASTBinaryExpression) i.getExpression(); |
| IASTExpression x= expr.getOperand1(); |
| IASTExpression y= expr.getOperand2(); |
| |
| IToken syntax= x.getTrailingSyntax(); |
| checkToken(syntax, "<<", offsetShift-offsetX-1); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| syntax= y.getLeadingSyntax(); |
| checkToken(syntax, "<<", offsetShift - offsetY); syntax= syntax.getNext(); |
| assertNull(syntax); |
| |
| syntax= expr.getSyntax(); |
| checkToken(syntax, "x", 0); syntax= syntax.getNext(); |
| checkToken(syntax, "<<", offsetShift-offsetX); syntax= syntax.getNext(); |
| checkToken(syntax, "y", offsetY-offsetX); syntax= syntax.getNext(); |
| assertNull(syntax); |
| } |
| |
| // int a= 1+2-3*4+10/2; // -4 |
| // int b= a+4; |
| // int* c= &b; |
| // enum X {e0, e4=4, e5, e2=2, e3}; |
| public void testValues() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, lang); |
| IVariable v= (IVariable) bh.assertNonProblem("a=", 1); |
| checkValue(v.getInitialValue(), -4); |
| v= (IVariable) bh.assertNonProblem("b=", 1); |
| checkValue(v.getInitialValue(), 0); |
| v= (IVariable) bh.assertNonProblem("c=", 1); |
| assertNull(v.getInitialValue().numberValue()); |
| |
| IEnumerator e= (IEnumerator) bh.assertNonProblem("e0", 2); |
| checkValue(e.getValue(), 0); |
| e= (IEnumerator) bh.assertNonProblem("e2", 2); |
| checkValue(e.getValue(), 2); |
| e= (IEnumerator) bh.assertNonProblem("e3", 2); |
| checkValue(e.getValue(), 3); |
| e= (IEnumerator) bh.assertNonProblem("e4", 2); |
| checkValue(e.getValue(), 4); |
| e= (IEnumerator) bh.assertNonProblem("e5", 2); |
| checkValue(e.getValue(), 5); |
| } |
| } |
| |
| private void checkValue(IValue initialValue, int i) { |
| assertNotNull(initialValue); |
| final Number numericalValue = initialValue.numberValue(); |
| assertNotNull(numericalValue); |
| assertEquals(i, numericalValue.intValue()); |
| } |
| |
| // void myfunc(char *arg) {} |
| // void (*funcVar2)(char *) = myfunc; |
| // void caller() { |
| // myfunc(""); |
| // } |
| public void testReferencesInInitializer_251514() throws Exception { |
| final String code = getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang, true); |
| IASTFunctionDefinition fdef= getDeclaration(tu, 0); |
| IASTName name= fdef.getDeclarator().getName(); |
| assertEquals(2, tu.getReferences(name.resolveBinding()).length); |
| } |
| } |
| |
| // void test() { |
| // const void* p = &"string"; |
| // } |
| public void testAdressOfStringLiteral_252970() throws Exception { |
| final String code = getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| parseAndCheckBindings(code, lang); |
| } |
| } |
| |
| // int a[]= { |
| |
| // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| |
| // }; |
| public void testScalabilityOfLargeTrivialInitializer_253690() throws Exception { |
| sValidateCopy = false; |
| final int AMOUNT = 250000; |
| final CharSequence[] input = getContents(3); |
| final String code = concatInput(input, new int[] { 1, AMOUNT / 10, 1 }); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| intermittentTest(() -> { |
| long mem = memoryUsed(); |
| IASTTranslationUnit tu = parse(code, lang, false, true, 0); |
| long diff = memoryUsed() - mem; |
| // Allow a copy of the buffer, plus less than 1.5 bytes per initializer. |
| final int expected = code.length() * 2 + AMOUNT + AMOUNT / 2; |
| assertTrue(String.valueOf(diff) + " expected < " + expected, diff < expected); |
| assertTrue(tu.isFrozen()); |
| }); |
| } |
| } |
| |
| // struct MyStrcutType {}; |
| // MyStructType Data [1000000] = { |
| // {1,2,3}, |
| // 1.2, |
| // { |
| |
| // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| |
| // } |
| // }; |
| public void testLargeTrivialAggregateInitializer_253690() throws Exception { |
| sValidateCopy = false; |
| final int AMOUNT = 250000; |
| final CharSequence[] input = getContents(3); |
| final String code = concatInput(input, new int[] { 1, AMOUNT / 10, 1 }); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| intermittentTest(() -> { |
| long mem = memoryUsed(); |
| IASTTranslationUnit tu = parse(code, lang, false, true, 0); |
| long diff = memoryUsed() - mem; |
| // Allow a copy of the buffer, plus less than 1.5 bytes per |
| // initializer. |
| final int expected = code.length() * 2 + AMOUNT + AMOUNT / 2; |
| assertTrue(String.valueOf(diff) + " expected < " + expected, diff < expected); |
| assertTrue(tu.isFrozen()); |
| }); |
| } |
| } |
| |
| // int a[]= { |
| |
| // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| |
| // }; |
| public void testMaximumTrivialExpressionsInInitializers_412380() throws Exception { |
| sValidateCopy = false; |
| final int AMOUNT = 250000; |
| final int maximumTrivialExpressionsInInitializer = 1000; |
| final int additionalBytesPerInitializer = 90; |
| final CharSequence[] input = getContents(3); |
| final String code = concatInput(input, new int[] { 1, AMOUNT / 10, 1 }); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| intermittentTest(() -> { |
| long mem = memoryUsed(); |
| IASTTranslationUnit tu = parse(code, lang, false, true, maximumTrivialExpressionsInInitializer); |
| long diff = memoryUsed() - mem; |
| final int initializerSize = maximumTrivialExpressionsInInitializer * additionalBytesPerInitializer; |
| // Allow a copy of the buffer, plus less than 1.5 bytes per initializer. |
| final int expected = code.length() * 2 + AMOUNT + AMOUNT / 2 + initializerSize; |
| assertTrue(String.valueOf(diff) + " expected < " + expected, diff < expected); |
| assertTrue(tu.isFrozen()); |
| tu.accept(new ASTVisitor() { |
| { |
| shouldVisitInitializers = true; |
| } |
| |
| @Override |
| public int visit(IASTInitializer initializer) { |
| if (initializer instanceof IASTEqualsInitializer) { |
| IASTEqualsInitializer equalsInitializer = (IASTEqualsInitializer) initializer; |
| IASTInitializerClause initClause = equalsInitializer.getInitializerClause(); |
| if (initClause instanceof IASTInitializerList) { |
| IASTInitializerList initList = (IASTInitializerList) initClause; |
| assertEquals(maximumTrivialExpressionsInInitializer, initList.getClauses().length); |
| } |
| } |
| return ASTVisitor.PROCESS_CONTINUE; |
| } |
| }); |
| }); |
| } |
| } |
| |
| private String concatInput(CharSequence[] snippets, int[] snippetOccurences) { |
| final StringBuilder result = new StringBuilder(); |
| final int snippetsToConcat = Math.min(snippets.length, snippetOccurences.length); |
| for (int i = 0; i < snippetsToConcat; i++) { |
| final CharSequence string = snippets[i]; |
| for (int times = 0; times < snippetOccurences[i]; times++) { |
| result.append(string); |
| } |
| } |
| return result.toString(); |
| } |
| |
| public interface RunnableWithException { |
| public abstract void run() throws Exception; |
| } |
| |
| /** |
| * As the tests using memoryUsed depend on estimating memory used, they can |
| * be somewhat intermittent if another thread comes along and makes some |
| * allocations at the wrong time. Therefore allow test to run multiple times |
| * to ensure memory usage is as expected. See Bug 505743. |
| */ |
| private void intermittentTest(RunnableWithException test) throws Exception { |
| Exception lastException = null; |
| for (int i = 0; i < RETRY_INTERMITTENT_COUNT ; i++) { |
| try { |
| test.run(); |
| // no exception, success |
| return; |
| } catch (Exception | AssertionError e) { |
| lastException = new Exception("Attempted intermittent test " + RETRY_INTERMITTENT_COUNT |
| + " times and it failed each time. Nested exception is last exception." |
| + "Previous exceptions are on stderr", e); |
| if (i < RETRY_INTERMITTENT_COUNT) { |
| System.err.println("Intermittent test failed, test will be re-tried. Exception was:"); |
| } else { |
| System.err.println("Intermittent test failed on each retry, marking test failed. Exception was:"); |
| } |
| e.printStackTrace(); |
| } |
| } |
| throw lastException; |
| } |
| |
| /** |
| * Use {@link #intermittentTest(RunnableWithException)} when testing against memory used. |
| */ |
| private long memoryUsed() throws InterruptedException { |
| final Runtime runtime = Runtime.getRuntime(); |
| long mem= runtime.totalMemory()-runtime.freeMemory(); |
| long newMem= mem; |
| int i=0; |
| do { |
| Thread.sleep(50); |
| System.gc(); |
| mem= newMem; |
| newMem= runtime.totalMemory()-runtime.freeMemory(); |
| } while (newMem < mem && ++i<5); |
| return mem; |
| } |
| |
| // int n= 0; |
| // int a[]= {0x00, sizeof(n)}; |
| public void testNonTrivialInitializer_253690() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parse(code, lang, false, true, 0); |
| IASTSimpleDeclaration d= getDeclaration(tu, 0); |
| IBinding b= d.getDeclarators()[0].getName().resolveBinding(); |
| IASTName[] refs = tu.getReferences(b); |
| assertEquals(1, refs.length); |
| } |
| } |
| |
| // void test() { |
| // const void* p = 1+2; |
| // } |
| public void testGetChildren_256127() throws Exception { |
| final String code = getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTNode node= parseAndCheckBindings(code, lang); |
| |
| IASTNode[] children= node.getChildren(); |
| assertEquals(1, children.length); |
| assertInstance(children[0], IASTFunctionDefinition.class); |
| |
| children= children[0].getChildren(); |
| assertEquals(3, children.length); |
| assertInstance(children[0], IASTDeclSpecifier.class); |
| assertInstance(children[1], IASTDeclarator.class); |
| assertInstance(children[2], IASTCompoundStatement.class); |
| |
| children= children[2].getChildren(); |
| assertEquals(1, children.length); |
| assertInstance(children[0], IASTDeclarationStatement.class); |
| |
| children= children[0].getChildren()[0].getChildren(); // skip declaration |
| assertEquals(2, children.length); |
| assertInstance(children[0], IASTDeclSpecifier.class); |
| assertInstance(children[1], IASTDeclarator.class); |
| |
| children= children[1].getChildren(); |
| assertEquals(3, children.length); |
| assertInstance(children[0], IASTPointerOperator.class); |
| assertInstance(children[1], IASTName.class); |
| assertInstance(children[2], IASTInitializer.class); |
| |
| children= children[2].getChildren()[0].getChildren(); // skip binary expression |
| assertEquals(2, children.length); |
| assertInstance(children[0], IASTLiteralExpression.class); |
| assertInstance(children[1], IASTLiteralExpression.class); |
| |
| assertEquals(0, children[0].getChildren().length); |
| } |
| } |
| |
| // struct s { |
| // int (mem); |
| // }; |
| // void foo() { |
| // struct s v; |
| // v.mem = 1; |
| // } |
| public void testNestedDeclarator_257540() throws Exception { |
| final String code= getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // typedef struct { |
| // float a; |
| // int b; |
| // } cs; |
| // void x(void) { |
| // cs foo; |
| // foo = ((cs) {1.2,1}); |
| // } |
| public void testCompoundLiterals_258496() throws Exception { |
| final String code= getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // __thread int i; |
| // static __thread int j; |
| // extern __thread int k; |
| public void testThreadLocalVariables_260387() throws Exception { |
| final String code= getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void test() { |
| // int a,b; |
| // if ((a)+b); |
| // } |
| public void testAmbiguityResolutionInIfCondition_261043() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang, true); |
| IASTFunctionDefinition fdef= getDeclaration(tu, 0); |
| IASTIfStatement ifstmt= getStatement(fdef, 1); |
| IASTExpression expr= ifstmt.getConditionExpression(); |
| assertInstance(expr, IASTBinaryExpression.class); |
| } |
| } |
| |
| // typedef int TInt; |
| // struct X { |
| // const TInt; // declaration without name |
| // const a; // declares a; |
| // }; |
| public void testAmbiguousDeclaration_259373() throws Exception { |
| final String code= getAboveComment(); |
| IASTTranslationUnit tu= parseAndCheckBindings(code, C, true); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, false); |
| ITypedef td= bh.assertNonProblem("TInt; //", 4); |
| IField f= bh.assertNonProblem("a;", 1); |
| } |
| |
| // struct beta { |
| // int glob; |
| // }; |
| // void foo() { |
| // struct beta* pg; |
| // struct beta; |
| // struct beta* pl; |
| // |
| // struct beta { |
| // char loc; |
| // }; |
| // pg->glob= 0; |
| // pl->loc= 1; |
| // } |
| public void testLocalVsGlobalStruct_255973() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang, true); |
| } |
| } |
| |
| // typedef struct A A; |
| // struct A; // struct |
| // struct A* a; |
| public void testTypedefWithSameName() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang, true); |
| |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang == CPP); |
| ITypedef t= ba.assertNonProblem("A;", 1); |
| ICompositeType s1= ba.assertNonProblem("A; // struct", 1); |
| ICompositeType s2= ba.assertNonProblem("A*", 1); |
| assertSame(s1, s2); |
| assertSame(s1, t.getType()); |
| } |
| } |
| |
| // typedef long unsigned int size_t; |
| // |
| // size_t a = 0; |
| // size_t x = a + 5; |
| // size_t y = 2 + a; |
| // size_t y = a * 2; |
| public void testTypeOfExpressionWithTypedef_380498_1() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| IASTExpression exp = ba.assertNode("a + 5", IASTExpression.class); |
| assertTrue(exp.getExpressionType() instanceof ITypedef); |
| assertEquals("size_t", ((ITypedef) exp.getExpressionType()).getName()); |
| exp = ba.assertNode("2 + a", IASTExpression.class); |
| assertTrue(exp.getExpressionType() instanceof ITypedef); |
| assertEquals("size_t", ((ITypedef) exp.getExpressionType()).getName()); |
| exp = ba.assertNode("a * 2", IASTExpression.class); |
| assertTrue(exp.getExpressionType() instanceof ITypedef); |
| assertEquals("size_t", ((ITypedef) exp.getExpressionType()).getName()); |
| } |
| } |
| |
| // typedef void* VoidPtr; |
| // typedef VoidPtr (*Func)(); |
| // |
| // void test(Func f) { |
| // f(); |
| // } |
| public void testTypeOfExpressionWithTypedef_380498_2() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage lang: ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang); |
| IASTExpression exp = ba.assertNode("f()", IASTExpression.class); |
| assertTrue(exp.getExpressionType() instanceof ITypedef); |
| assertEquals("VoidPtr", ((ITypedef) exp.getExpressionType()).getName()); |
| } |
| } |
| // typedef int TInt; |
| // int a= TInt; //ref |
| public void testTypeAsExpressionIsProblem_261175() throws Exception { |
| final String code= getAboveComment(); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, true); |
| bh.assertProblem("TInt; //ref", 4); |
| |
| bh= new BindingAssertionHelper(code, false); |
| bh.assertProblem("TInt; //ref", 4); |
| } |
| |
| // typedef int x, y; |
| // void func(int c) { |
| // c= sizeof(x(y)); |
| // x(y); |
| // } |
| public void testSizeofFunctionType_252243() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| BindingAssertionHelper ba= new BindingAssertionHelper(code, lang == CPP); |
| ba.assertProblem("y));", 1); |
| IVariable v= ba.assertNonProblem("y);", 1); |
| } |
| } |
| |
| // int* v; |
| public void testPointerOperatorsAsChildren_260461() throws Exception { |
| final String code= getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang, true); |
| IASTSimpleDeclaration decl= getDeclaration(tu, 0); |
| IASTDeclarator dtor= decl.getDeclarators()[0]; |
| IASTNode[] nodes = dtor.getChildren(); |
| assertEquals(2, nodes.length); |
| assertInstance(nodes[0], IASTPointerOperator.class); |
| } |
| } |
| |
| // int a = -142; |
| // int b = 456L; |
| // int c = 100000LL; |
| // int d = 0U; |
| // int e = 1UL; |
| // int f = 9u; |
| // int g = 1234l; |
| // int h = -123ll; |
| // int i = 8888uL; |
| public void testBug269705_int_literal() throws Exception { |
| final String code= getAboveComment(); |
| |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| |
| // int a = -142; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 0); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int b = 456L; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 1); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertTrue(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int c = 100000LL; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 2); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isLong()); |
| assertTrue(isLongLong(t)); |
| } |
| |
| // int d = 0U; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 3); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertTrue(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertFalse(isLongLong(t)); |
| assertFalse(t.isLong()); |
| |
| } |
| |
| // int e = 1UL; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 4); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertTrue(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertTrue(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int f = 9u; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 5); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertTrue(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertFalse(isLongLong(t)); |
| assertFalse(t.isLong()); |
| |
| } |
| |
| // int g = 1234l; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 6); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertTrue(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int h = -123ll; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 7); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isLong()); |
| assertTrue(isLongLong(t)); |
| } |
| |
| // int i = 8888uL; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 8); |
| assertTrue(t.getType() == IBasicType.t_int); |
| assertTrue(t.isUnsigned()); |
| assertFalse(t.isSigned()); |
| assertTrue(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| } |
| } |
| |
| // int a = -142.0; |
| // int b = 456.1f; |
| // int c = 100000.99F; |
| // int d = 0.123l; |
| // int e = 1.3L; |
| public void testBug269705_float_literal() throws Exception { |
| final String code= getAboveComment(); |
| |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| IASTDeclaration[] declarations = tu.getDeclarations(); |
| |
| // int a = -142.0; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 0); |
| assertTrue(t.getType() == IBasicType.t_double); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int b = 456.1f; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 1); |
| assertTrue(t.getType() == IBasicType.t_float); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int c = 100000.99F; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 2); |
| assertTrue(t.getType() == IBasicType.t_float); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isUnsigned()); |
| assertFalse(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| |
| // int d = 0.123l; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 3); |
| assertTrue(t.getType() == IBasicType.t_double); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isUnsigned()); |
| assertFalse(isLongLong(t)); |
| assertTrue(t.isLong()); |
| } |
| |
| // int e = 1.3L; |
| { |
| IBasicType t = getTypeForDeclaration(declarations, 4); |
| assertTrue(t.getType() == IBasicType.t_double); |
| assertFalse(t.isSigned()); |
| assertFalse(t.isUnsigned()); |
| assertTrue(t.isLong()); |
| assertFalse(isLongLong(t)); |
| } |
| } |
| } |
| |
| boolean isLongLong(IType t) { |
| if (t instanceof IBasicType) { |
| return ((IBasicType) t).isLongLong(); |
| } |
| return false; |
| } |
| |
| private IBasicType getTypeForDeclaration(IASTDeclaration[] declarations, int index) { |
| IASTInitializer init = ((IASTSimpleDeclaration) declarations[index]).getDeclarators()[0].getInitializer(); |
| return (IBasicType)((IASTExpression)((IASTEqualsInitializer) init).getInitializerClause()).getExpressionType(); |
| } |
| |
| // void test() { |
| // __DATE__; |
| // __FILE__; |
| // __LINE__; |
| // __STDC_HOSTED__; |
| // __STDC_VERSION__; |
| // __TIME__; |
| // } |
| public void testPredefinedMacroNamesC() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // long double longDouble = 1.0; |
| // double _double = 1.0; |
| // float _float= 1.0; |
| // signed long long int longLongInt = 1; |
| // signed long int longInt = 1; |
| // signed int _int = 1; |
| // signed short int shortInt = 1; |
| // signed char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be long double */ |
| // var = longDouble + longDouble; |
| // var = longDouble + _double; |
| // var = longDouble + _float; |
| // var = longDouble + longLongInt; |
| // var = longDouble + longInt; |
| // var = longDouble + _int; |
| // var = longDouble + shortInt; |
| // var = longDouble + _char; |
| // |
| // var = longDouble + longDouble; |
| // var = _double + longDouble; |
| // var = _float + longDouble; |
| // var = longLongInt + longDouble; |
| // var = longInt + longDouble; |
| // var = _int + longDouble; |
| // var = shortInt + longDouble; |
| // var = _char + longDouble; |
| // } |
| public void testTypePromotion_long_double() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eDouble, ((IBasicType) type1).getKind()); |
| assertTrue(((IBasicType) type1).isLong()); |
| } |
| } |
| } |
| |
| // double _double = 1.0; |
| // float _float= 1.0; |
| // long long int longLongInt = 1; |
| // long int longInt = 1; |
| // int _int = 1; |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be double */ |
| // var = _double + _double; |
| // var = _double + _float; |
| // var = _double + longLongInt; |
| // var = _double + longInt; |
| // var = _double + _int; |
| // var = _double + shortInt; |
| // var = _double + _char; |
| // |
| // var = _float + _double; |
| // var = longLongInt + _double; |
| // var = longInt + _double; |
| // var = _int + _double; |
| // var = shortInt + _double; |
| // var = _char + _double; |
| // |
| // } |
| public void testTypePromotion_double() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eDouble, ((IBasicType) type1).getKind()); |
| assertFalse(((IBasicType) type1).isLong()); |
| } |
| } |
| } |
| |
| // float _float= 1.0; |
| // long long int longLongInt = 1; |
| // long int longInt = 1; |
| // int _int = 1; |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be float */ |
| // var = _float + longLongInt; |
| // var = _float + longInt; |
| // var = _float + _int; |
| // var = _float + shortInt; |
| // var = _float + _char; |
| // |
| // var = longLongInt + _float; |
| // var = longInt + _float; |
| // var = _int + _float; |
| // var = shortInt + _float; |
| // var = _char + _float; |
| // |
| // } |
| public void testTypePromotion_float() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eFloat, ((IBasicType) type1).getKind()); |
| } |
| } |
| } |
| |
| // long long int longLongInt = 1; |
| // long int longInt = 1; |
| // int _int = 1; |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be long long int */ |
| // var = longLongInt + longLongInt; |
| // var = longLongInt + longInt; |
| // var = longLongInt + _int; |
| // var = longLongInt + shortInt; |
| // var = longLongInt + _char; |
| // |
| // var = longLongInt + longLongInt; |
| // var = longInt + longLongInt; |
| // var = _int + longLongInt; |
| // var = shortInt + longLongInt; |
| // var = _char + longLongInt; |
| // |
| // } |
| // |
| public void testTypePromotion_longlongint() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang, true); // support for long long |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eInt, ((IBasicType) type1).getKind()); |
| assertTrue(((IBasicType) type1).isLongLong()); |
| } |
| } |
| } |
| |
| // long long int longLongInt = 1; |
| // long int longInt = 1; |
| // int _int = 1; |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be long int */ |
| // var = longInt + longInt; |
| // var = longInt + _int; |
| // var = longInt + shortInt; |
| // var = longInt + _char; |
| // |
| // var = _int + longInt; |
| // var = shortInt + longInt; |
| // var = _char + longInt; |
| // |
| // } |
| public void testTypePromotion_longint() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eInt, ((IBasicType) type1).getKind()); |
| assertTrue(((IBasicType) type1).isLong()); |
| } |
| } |
| } |
| |
| // int _int = 1; |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be int */ |
| // var = _int + _int; |
| // var = _int + shortInt; |
| // var = _int + _char; |
| // |
| // var = shortInt + _int; |
| // var = _char + _int; |
| // |
| // } |
| public void testTypePromotion_int() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IType type1 = expr1.getExpressionType(); |
| assertEquals(Kind.eInt, ((IBasicType) type1).getKind()); |
| assertFalse(((IBasicType) type1).isLong()); |
| assertFalse(((IBasicType) type1).isShort()); |
| } |
| } |
| } |
| |
| // short int shortInt = 1; |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be signed int */ |
| // var = shortInt + shortInt; |
| // var = shortInt + _char; |
| // |
| // var = _char + shortInt; |
| // |
| // } |
| public void testTypePromotion_short_int() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr1.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isLong()); |
| assertFalse(type1.isShort()); |
| } |
| } |
| } |
| |
| // char _char = 1; |
| // |
| // float var; |
| // void test() { |
| // /* The following should all be signed int */ |
| // var = _char + _char; |
| // } |
| public void testTypePromotion_char() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| for (IASTStatement stmt : bodyStmts) { |
| IASTBinaryExpression expr1 = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) stmt) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr1.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isLong()); |
| assertFalse(type1.isShort()); |
| } |
| } |
| } |
| |
| // |
| // char _char = 1; |
| // signed char signedChar = 1; |
| // unsigned char unsignedChar = 1; |
| // signed int signedInt = 1; |
| // unsigned int unsignedInt = 1; |
| // signed long int signedLongInt = 1; |
| // unsigned long int unsignedLongInt = 1; |
| // signed long long int longLongInt = 1; |
| // unsigned long long int unsignedlongLongInt = 1; |
| // unsigned long long var = 1; |
| // void test() { |
| // /* (0) Should be an signed int */ |
| // var = signedChar + unsignedChar; |
| // |
| // /* (1) Should be an signed int */ |
| // var = unsignedChar + signedChar; |
| // |
| // /* (2) Should be a signed int*/ |
| // var = unsignedChar + signedInt; |
| // |
| // /* (3) Should be an unsigned int*/ |
| // var = unsignedInt + signedChar; |
| // |
| // /* (4) Should be a signed long int */ |
| // var = signedLongInt + unsignedInt; |
| // |
| // /* (5) Should be an unsigned long int*/ |
| // var = signedLongInt + unsignedLongInt; |
| // |
| // /* (6) Should be an unsigned long int*/ |
| // var = unsignedLongInt + signedLongInt; |
| // } |
| public void testTypePromotion_signedAndUnsignedInts() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition func = null; |
| |
| for (IASTDeclaration d : ast.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| func = (IASTFunctionDefinition) d; |
| break; |
| } |
| } |
| assertNotNull(func); |
| |
| IASTStatement[] bodyStmts = ((IASTCompoundStatement) func.getBody()).getStatements(); |
| |
| // /* (0) Should be an signed int */ |
| // var = signedChar + unsignedChar; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[0]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertFalse(type1.isLong()); |
| } |
| |
| // /* (1) Should be an singed int */ |
| // var = unsignedChar + signedChar; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[1]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertFalse(type1.isLong()); |
| } |
| |
| // /* (2) Should be a signed int*/ |
| // var = unsignedChar + signedInt; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[2]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertFalse(type1.isLong()); |
| assertFalse(type1.isLongLong()); |
| } |
| |
| // /* (3) Should be an unsigned int*/ |
| // var = unsignedInt + signedChar; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[3]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertTrue(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertFalse(type1.isLong()); |
| assertFalse(type1.isLongLong()); |
| } |
| |
| // /* (4) Should be a signed long int */ |
| // var = signedLongInt + unsignedInt; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[4]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertFalse(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertTrue(type1.isLong()); |
| assertFalse(type1.isLongLong()); |
| } |
| |
| // /* (5) Should be an unsigned long int*/ |
| // var = signedLongInt + unsignedLongInt; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[5]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertTrue(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertTrue(type1.isLong()); |
| assertFalse(type1.isLongLong()); |
| } |
| |
| // /* (6) Should be an unsigned long int*/ |
| // var = unsignedLongInt + signedLongInt; |
| { |
| IASTBinaryExpression expr = (IASTBinaryExpression) ((IASTBinaryExpression) ((IASTExpressionStatement) bodyStmts[5]) |
| .getExpression()).getOperand2(); |
| IBasicType type1 = (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, type1.getKind()); |
| assertTrue(type1.isUnsigned()); |
| assertFalse(type1.isShort()); |
| assertTrue(type1.isLong()); |
| assertFalse(type1.isLongLong()); |
| } |
| } |
| } |
| |
| // char c; |
| // void func() { |
| // c; |
| // -c; |
| // +c; |
| // ~c; |
| // } |
| public void testPromotionInUnaryExpressions() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit ast = parseAndCheckBindings(getAboveComment(), lang); |
| IASTFunctionDefinition fdef= getDeclaration(ast, 1); |
| IASTExpression expr= getExpressionOfStatement(fdef, 0); |
| IBasicType t= (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eChar, t.getKind()); |
| assertEquals(0, t.getModifiers()); |
| |
| for (int i = 1; i < 4; i++) { |
| expr= getExpressionOfStatement(fdef, i); |
| t= (IBasicType) expr.getExpressionType(); |
| assertEquals(Kind.eInt, t.getKind()); // promoted to int |
| assertEquals(0, t.getModifiers()); |
| } |
| } |
| } |
| |
| // |
| // int MyGlobal[10]; |
| // |
| public void testBug273797() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), C); |
| IASTName n = ((IASTSimpleDeclaration) tu.getDeclarations()[0]).getDeclarators()[0].getName(); |
| IVariable v = (IVariable) n.resolveBinding(); |
| |
| ICArrayType t = (ICArrayType) v.getType(); |
| assertFalse(t.isConst()); |
| assertFalse(t.isRestrict()); |
| assertFalse(t.isVolatile()); |
| assertFalse(t.isVariableLength()); |
| assertFalse(t.isStatic()); |
| |
| IASTExpression e = t.getArraySizeExpression(); |
| assertNotNull(e); |
| assertTrue(e instanceof IASTLiteralExpression); |
| } |
| |
| // enum myenum { value1, value2, value3 }; |
| // |
| // void test() { |
| // (int) value1; |
| // } |
| public void testBug278797() throws Exception { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), C); |
| IASTFunctionDefinition func = (IASTFunctionDefinition) tu.getDeclarations()[1]; |
| IASTExpressionStatement stmt = ((IASTExpressionStatement)((IASTCompoundStatement) func.getBody()).getStatements()[0]); |
| IType t = ((IASTCastExpression) stmt.getExpression()).getOperand().getExpressionType(); |
| assertNotNull(t); |
| assertTrue(t instanceof IEnumeration); |
| } |
| |
| // /*Check that sizes are stored correctly in chains of IArrayType*/ |
| //int a[2][3] = {{1,2,3},{4,5,6}}; |
| //int b[3][2] = {{1,2},{3,4},{5,6}}; |
| // |
| public void testBug277458() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); |
| assertTrue(tu.isFrozen()); |
| //int a[2][3] = {{1,2,3},{4,5,6}}; |
| { |
| IASTDeclaration d = tu.getDeclarations()[0]; |
| IBinding b = ((IASTSimpleDeclaration) d).getDeclarators()[0].getName().resolveBinding(); |
| IType t = ((IVariable) b).getType(); |
| assertTrue(t instanceof IArrayType); |
| IArrayType at1 = (IArrayType) t; |
| IASTExpression size1 = at1.getArraySizeExpression(); |
| assertTrue(at1.getType() instanceof IArrayType); |
| IArrayType at2 = (IArrayType) at1.getType(); |
| IASTExpression size2 = at2.getArraySizeExpression(); |
| assertTrue(size1 instanceof IASTLiteralExpression); |
| assertEquals(((IASTLiteralExpression) size1).getValue()[0], '2'); |
| assertTrue(size2 instanceof IASTLiteralExpression); |
| assertEquals(((IASTLiteralExpression) size2).getValue()[0], '3'); |
| } |
| //int b[3][2] = {{1,2},{3,4},{5,6}}; |
| { |
| IASTDeclaration d = tu.getDeclarations()[1]; |
| IBinding b = ((IASTSimpleDeclaration) d).getDeclarators()[0].getName().resolveBinding(); |
| IType t = ((IVariable) b).getType(); |
| assertTrue(t instanceof IArrayType); |
| IArrayType at1 = (IArrayType) t; |
| IASTExpression size1 = at1.getArraySizeExpression(); |
| assertTrue(at1.getType() instanceof IArrayType); |
| IArrayType at2 = (IArrayType) at1.getType(); |
| IASTExpression size2 = at2.getArraySizeExpression(); |
| assertTrue(size1 instanceof IASTLiteralExpression); |
| assertEquals(((IASTLiteralExpression) size1).getValue()[0], '3'); |
| assertTrue(size2 instanceof IASTLiteralExpression); |
| assertEquals(((IASTLiteralExpression) size2).getValue()[0], '2'); |
| } |
| } |
| } |
| |
| // /* Check that a parameter declared as a typedef'd array |
| // * is treated as a pointer |
| // */ |
| //typedef int my_buf[16]; |
| //void goo(my_buf in); |
| // |
| public void testBug284248() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); |
| assertTrue(tu.isFrozen()); |
| IASTName n = ((IASTSimpleDeclaration) tu.getDeclarations()[1]).getDeclarators()[0].getName(); |
| assertTrue(((IFunction) n.resolveBinding()).getType().getParameterTypes()[0] instanceof IPointerType); |
| } |
| } |
| |
| // |
| // /* check that enumerator values are evaluated correctly for |
| // * conditional expressions */ |
| // |
| //enum |
| //{ |
| // _ISalnum = 11 < 8 ? 1 : 2, |
| // _ISalnum2 = 11 > 8 ? 1 : 2 |
| //}; |
| // |
| public void testBug295851() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); |
| IASTEnumerationSpecifier enumSpec = (IASTEnumerationSpecifier)((IASTSimpleDeclaration) tu.getDeclarations()[0]).getDeclSpecifier(); |
| IEnumerator enumeratorBinding = (IEnumerator) enumSpec.getEnumerators()[0].getName().resolveBinding(); |
| IValue value = enumeratorBinding.getValue(); |
| assertEquals(2, value.numberValue().longValue()); |
| IEnumerator enumeratorBinding2 = (IEnumerator) enumSpec.getEnumerators()[1].getName().resolveBinding(); |
| IValue value2 = enumeratorBinding2.getValue(); |
| assertEquals(1, value2.numberValue().longValue()); |
| } |
| } |
| |
| // extern void goo(); |
| // struct MyStruct { |
| // int a; |
| // void (*ptr)(); |
| // }; |
| // void foo() { |
| // struct MyStruct structure; |
| // structure.a = 1; |
| // structure.ptr = goo; |
| // } |
| public void testBindingsOnFields() throws Exception { |
| IASTTranslationUnit tu = parse(getAboveComment(), C, false); |
| IASTCompoundStatement bodyStmt = (IASTCompoundStatement)((IASTFunctionDefinition) tu.getDeclarations()[2]).getBody(); |
| |
| // Get the IFields bindings from the type used in the declaration of structure |
| IASTName n = ((IASTSimpleDeclaration)((IASTDeclarationStatement) bodyStmt.getStatements()[0]).getDeclaration()).getDeclarators()[0].getName(); |
| ICompositeType t = (ICompositeType)((IVariable) n.resolveBinding()).getType(); |
| IField[] fields = t.getFields(); |
| assertTrue(fields.length == 2); |
| |
| // Get the IField for the first assignment |
| IASTFieldReference ref1 = (IASTFieldReference)((IASTBinaryExpression)((IASTExpressionStatement) bodyStmt.getStatements()[1]).getExpression()).getOperand1(); |
| IBinding field1 = ref1.getFieldName().resolveBinding(); |
| |
| // Get the IField for the second assignment |
| IASTFieldReference ref2 = (IASTFieldReference)((IASTBinaryExpression)((IASTExpressionStatement) bodyStmt.getStatements()[2]).getExpression()).getOperand1(); |
| IBinding field2 = ref2.getFieldName().resolveBinding(); |
| |
| // Compare the IField from the type and the assignments |
| assertEquals(fields[0], field1); |
| assertEquals(fields[1], field2); // fails |
| |
| assertEquals(1, ((ICInternalBinding) field1).getDeclarations().length); |
| assertEquals(1, ((ICInternalBinding) field2).getDeclarations().length); |
| } |
| |
| // /* |
| // * Check that the type returned by CASTArraySubscriptExpression |
| // * handles typedefs correctly. |
| // */ |
| // struct s { |
| // int a; |
| // }; |
| // typedef struct s* ptr; |
| // typedef struct s array[10]; |
| // typedef array newArray; |
| // ptr var1; |
| // struct s* var2; |
| // array var3; |
| // struct s var4[10]; |
| // newArray var5; |
| // |
| // void foo() { |
| // /* The type of the array subscript expression should be struct s |
| // * each of the following statements |
| // */ |
| // var1[1].a = 1; |
| // var2[1].a = 1; |
| // var3[1].a = 1; |
| // var4[1].a = 1; |
| // var5[1].a = 1; |
| // } |
| public void testArraySubscriptExpressionGetExpressionType() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); |
| assertTrue(tu.isFrozen()); |
| for (IASTDeclaration d : tu.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| for (IASTStatement s : ((IASTCompoundStatement) ((IASTFunctionDefinition) d).getBody()).getStatements()) { |
| IASTExpression op1 = ((IASTBinaryExpression) ((IASTExpressionStatement) s).getExpression()).getOperand1(); |
| IASTExpression owner = ((IASTFieldReference) op1).getFieldOwner(); |
| IType t = owner.getExpressionType(); |
| assertTrue(t instanceof ICompositeType); |
| assertEquals("s", ((ICompositeType) t).getName()); |
| } |
| } |
| } |
| } |
| } |
| |
| // char array[10]; |
| // char* ptr; |
| // |
| // void test() { |
| // array + 1; |
| // 1 + array; |
| // ptr + 1; |
| // 1 + ptr; |
| // } |
| public void testPointerExpression_131037() throws Exception { |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(getAboveComment(), lang); |
| assertTrue(tu.isFrozen()); |
| for (IASTDeclaration d : tu.getDeclarations()) { |
| if (d instanceof IASTFunctionDefinition) { |
| for (IASTStatement s : ((IASTCompoundStatement) ((IASTFunctionDefinition) d).getBody()).getStatements()) { |
| IType t = ((IASTBinaryExpression) ((IASTExpressionStatement) s).getExpression()).getExpressionType(); |
| assertTrue(t instanceof IPointerType || t instanceof IArrayType); |
| assertEquals("char", ((IPointerType) t).getType().toString()); |
| } |
| } |
| } |
| } |
| } |
| |
| // extern int a[]; |
| // int a[1]; |
| public void testIncompleteArrays_269926() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C); |
| parseAndCheckBindings(code, CPP); |
| } |
| |
| // void f1(const int* p); |
| // void f2(const int* p) {} |
| public void testDroppingOfStorageDecl_293322() throws Exception { |
| final String code = getAboveComment(); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, false); |
| IFunction f= bh.assertNonProblem("f1", 2); |
| assertEquals("const int *", ASTTypeUtil.getType(f.getParameters()[0].getType())); |
| f= bh.assertNonProblem("f2", 2); |
| assertEquals("const int *", ASTTypeUtil.getType(f.getParameters()[0].getType())); |
| } |
| |
| // typedef int f(int); |
| // f ff; |
| public void testFunctionDeclViaTypedef_86495() throws Exception { |
| final String code = getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| IASTSimpleDeclaration decl= getDeclaration(tu, 1); |
| IFunction ff= (IFunction) decl.getDeclarators()[0].getName().resolveBinding(); |
| assertNotNull(ff.getType()); |
| assertEquals(1, ff.getParameters().length); |
| } |
| } |
| |
| // void f() { |
| // int a= |
| public void testLargeExpression_294029() throws Exception { |
| // when running the test in a suite, it cannot handle more than 160 parenthesis. |
| // run as a single test it does > 500. |
| sValidateCopy= false; |
| StringBuilder buf= new StringBuilder(); |
| buf.append(getAboveComment()); |
| final int depth= 160; |
| for (int i = 0; i < depth; i++) { |
| buf.append('('); |
| } |
| buf.append('1'); |
| for (int i = 0; i < depth; i++) { |
| buf.append(")+1"); |
| } |
| buf.append(";}"); |
| String code= buf.toString(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| } |
| } |
| |
| // static a[2]= {0,0}; |
| public void testSkipAggregateInitializer_297550() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parseAndCheckBindings(code, C, false, 0); |
| assertTrue(tu.hasNodesOmitted()); |
| } |
| |
| // static a[2]= {0,0}; |
| public void testNoSkipTrivialAggregateInitializer_412380() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parseAndCheckBindings(code, C, false); |
| assertFalse(tu.hasNodesOmitted()); |
| } |
| |
| // static int i = 0; |
| // static a[1]= {i}; |
| public void testNoSkipNonTrivialAggregateInitializer_412380() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu = parseAndCheckBindings(code, C, false, 0); |
| assertFalse(tu.hasNodesOmitted()); |
| } |
| |
| // typeof(b(1)) b(int); |
| public void testRecursiveFunctionType_321856() throws Exception { |
| final String code = getAboveComment(); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, false); |
| IFunction f= bh.assertNonProblem("b(1)", 1); |
| f= bh.assertNonProblem("b(int)", 1); |
| f.getType(); |
| } |
| |
| public void testDeepBinaryExpression_294969() throws Exception { |
| sValidateCopy= false; |
| StringBuilder buf= new StringBuilder("void f() {0"); |
| for (int i = 0; i < 150000; i++) { |
| buf.append('+').append(i); |
| } |
| buf.append(";}"); |
| String code= buf.toString(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| } |
| } |
| |
| public void testDeepElseif_298455() throws Exception { |
| sValidateCopy= false; |
| StringBuilder buf= new StringBuilder("void f() {if (0) {}"); |
| for (int i = 0; i < 75000; i++) { |
| buf.append("else if (0) {}"); |
| } |
| buf.append("}"); |
| String code= buf.toString(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu = parseAndCheckBindings(code, lang); |
| } |
| } |
| |
| // void f () __attribute__ ((int)); |
| public void testAttributeSyntax_298841() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void func(int* obj) { |
| // int* obj = 0; |
| // } |
| public void testParameterRedeclaration_301779() throws Exception { |
| final String code = getAboveComment(); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, true); |
| bh.assertNonProblem("obj", 3, IParameter.class); |
| bh.assertProblem("obj =", 3); |
| bh= new BindingAssertionHelper(code, false); |
| bh.assertNonProblem("obj", 3, IParameter.class); |
| bh.assertProblem("obj =", 3); |
| } |
| |
| // #define ONCE() PRAGMA(once) |
| // #define PRAGMA(x) _Pragma(#x) |
| // #pragma once |
| // _Pragma ("once") |
| // ONCE() |
| public void testPragmaOperator_294730() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu= parseAndCheckBindings(code, C); |
| IASTPreprocessorStatement[] stmts = tu.getAllPreprocessorStatements(); |
| assertEquals(5, stmts.length); |
| for (int i = 2; i < stmts.length; i++) { |
| IASTPreprocessorStatement stmt = stmts[i]; |
| assertInstance(stmt, IASTPreprocessorPragmaStatement.class); |
| assertEquals(i>2, ((IASTPreprocessorPragmaStatement) stmt).isPragmaOperator()); |
| } |
| tu= parseAndCheckBindings(code, CPP); |
| assertEquals(5, stmts.length); |
| for (int i = 2; i < stmts.length; i++) { |
| IASTPreprocessorStatement stmt = stmts[i]; |
| assertInstance(stmt, IASTPreprocessorPragmaStatement.class); |
| assertEquals(i>2, ((IASTPreprocessorPragmaStatement) stmt).isPragmaOperator()); |
| } |
| } |
| |
| // int min(int,int); |
| // void test() { |
| // int a= (min)(1, 2); |
| // } |
| public void testFunctionNameExpression() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // #define MACRO |
| // void funca(){ |
| // } |
| // MACRO |
| public void testEmptyTrailingMacro_303152() throws Exception { |
| final String code = getAboveComment(); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, lang); |
| IASTPreprocessorMacroExpansion[] expansions = tu.getMacroExpansions(); |
| assertEquals(1, expansions.length); |
| IToken t= tu.getSyntax(); |
| while (t.getNext() != null) |
| t= t.getNext(); |
| assertEquals("MACRO", t.getImage()); |
| } |
| } |
| |
| // typedef __builtin_va_list va_list; |
| // #define va_arg(v,l) __builtin_va_arg(v,l) |
| // void test(int c, ...) { |
| // int (*x)[3]; |
| // va_list list; |
| // x = va_arg(list, int(*)[3]); |
| // } |
| public void testVaArgWithFunctionPtr_311030() throws Exception { |
| final String code = getAboveComment(); |
| parseAndCheckBindings(code, C, true); |
| parseAndCheckBindings(code, CPP, true); |
| } |
| |
| // void test() { |
| // __builtin_va_list result; |
| // } |
| public void testLocalVariableOfTypeVaList_313270() throws Exception { |
| final String code = getAboveComment(); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, false); |
| IBinding var= bh.assertNonProblem("result", 0); |
| assertInstance(var, IVariable.class); |
| assertTrue(var.getScope().getKind() == EScopeKind.eLocal); |
| |
| bh= new BindingAssertionHelper(code, true); |
| var= bh.assertNonProblem("result", 0); |
| assertInstance(var, IVariable.class); |
| assertTrue(var.getScope().getKind() == EScopeKind.eLocal); |
| } |
| |
| // void foo(int i); |
| // void foo(int j) { } |
| public void testParameterBindings_316931() throws Exception { |
| String code= getAboveComment(); |
| parseAndCheckBindings(code); |
| for (ParserLanguage lang : ParserLanguage.values()) { |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, lang); |
| IParameter i= bh.assertNonProblem("i)", 1); |
| IParameter j= bh.assertNonProblem("j)", 1); |
| assertSame(i, j); |
| |
| IASTTranslationUnit tu= bh.getTranslationUnit(); |
| IASTName[] decls = tu.getDeclarationsInAST(i); |
| assertEquals(2, decls.length); |
| decls = tu.getDeclarationsInAST(j); |
| assertEquals(2, decls.length); |
| } |
| } |
| |
| // typedef __typeof__((int*)0-(int*)0) ptrdiff_t; |
| // typedef __typeof__(sizeof(int)) size_t; |
| public void testPtrDiffRecursion_317004() throws Exception { |
| final String comment = getAboveComment(); |
| String code= comment; |
| parseAndCheckBindings(code, C, true); |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, false); |
| ITypedef td= bh.assertNonProblem("ptrdiff_t", 0); |
| assertEquals("long int", ASTTypeUtil.getType(td.getType())); |
| td= bh.assertNonProblem("size_t", 0); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(td.getType())); |
| |
| code= "namespace std {" + comment + "}"; |
| parseAndCheckBindings(code, CPP, true); |
| bh= new BindingAssertionHelper(code, true); |
| td= bh.assertNonProblem("ptrdiff_t", 0); |
| assertEquals("long int", ASTTypeUtil.getType(td.getType())); |
| td= bh.assertNonProblem("size_t", 0); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(td.getType())); |
| } |
| |
| // void f(int a) { |
| // int tmp = a; |
| // } |
| // void f(int); |
| public void testParameterResolution() throws Exception { |
| final String code = getAboveComment(); |
| |
| BindingAssertionHelper bh= new BindingAssertionHelper(code, true); |
| bh.assertNonProblem("f(int a)", 1); |
| bh.assertNonProblem("f(int)", 1); |
| bh.assertNonProblem("a;", 1); |
| |
| bh= new BindingAssertionHelper(code, false); |
| bh.assertNonProblem("f(int a)", 1); |
| bh.assertNonProblem("f(int)", 1); |
| bh.assertNonProblem("a;", 1); |
| } |
| |
| // #ifdef A // active, not taken. |
| // #ifdef B // inactive, not taken. |
| // #endif // inactive |
| // #endif // active |
| public void testInactivePreprocessingStatements() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment()); |
| IASTPreprocessorStatement[] stmts= tu.getAllPreprocessorStatements(); |
| assertTrue(stmts[0].isActive()); |
| assertFalse(stmts[1].isActive()); |
| assertFalse(stmts[2].isActive()); |
| assertTrue(stmts[3].isActive()); |
| |
| assertFalse(((IASTPreprocessorIfdefStatement) stmts[0]).taken()); |
| assertFalse(((IASTPreprocessorIfdefStatement) stmts[1]).taken()); |
| } |
| |
| // void a() { |
| // typedef float size_t; |
| // sizeof(10); // wrong - getExpressionType returns float |
| // sizeof(int); // wrong - getExpressionType returns float |
| // } |
| public void testTypeOfSizeof_355052() throws Exception { |
| final String code = getAboveComment(); |
| IASTTranslationUnit tu= parseAndCheckBindings(code, CPP); |
| IASTFunctionDefinition a= getDeclaration(tu, 0); |
| IASTExpressionStatement es= getStatement(a, 1); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(es.getExpression().getExpressionType())); |
| es= getStatement(a, 2); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(es.getExpression().getExpressionType())); |
| |
| tu= parseAndCheckBindings(code, C); |
| a= getDeclaration(tu, 0); |
| es= getStatement(a, 1); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(es.getExpression().getExpressionType())); |
| es= getStatement(a, 2); |
| assertEquals("unsigned long int", ASTTypeUtil.getType(es.getExpression().getExpressionType())); |
| } |
| |
| // void foo(){ |
| // typedef int foobar_t; |
| // foobar_t *a = 0, *b = a; |
| // } |
| public void testAmbiguousStatement_360541() throws Exception { |
| parseAndCheckBindings(); |
| } |
| |
| // typedef int T[sizeof(int)]; |
| public void testSizeofExpression_362464() throws Exception { |
| String code= getAboveComment(); |
| for (ParserLanguage l : ParserLanguage.values()) { |
| IASTTranslationUnit tu= parseAndCheckBindings(code, l); |
| IASTSimpleDeclaration sdecl= getDeclaration(tu, 0); |
| ITypedef tdef= (ITypedef) sdecl.getDeclarators()[0].getName().resolveBinding(); |
| IArrayType at= (IArrayType) tdef.getType(); |
| IValue v= at.getSize(); |
| assertNotNull(v.numberValue()); |
| assertTrue(v.numberValue().longValue() == 4); |
| } |
| } |
| |
| // #define NULL_STATEMENT_MACRO ;; |
| // void macro_test() { |
| // NULL_STATEMENT_MACRO //comment |
| // } |
| public void testCommentAfterMacroExpansion_367827() throws Exception { |
| IASTTranslationUnit tu= parse(getAboveComment(), CPP); |
| IASTComment comment= tu.getComments()[0]; |
| assertEquals("//comment", new String(comment.getComment())); |
| assertEquals("//comment", comment.getRawSignature()); |
| } |
| |
| // template<typename T> |
| // void test(T n) { |
| // for (__decltype(n + 0) i = 0; i < n; i++) { |
| // } |
| // } |
| public void testGCCDecltype_397227() throws Exception { |
| parseAndCheckBindings(getAboveComment(), CPP, true); |
| } |
| |
| // #define macro(R) #R"" |
| public void testNoRawStringInPlainC_397127() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C, true); |
| } |
| |
| // #define X |
| // int a=X-1;X |
| public void testMacroReferences_399394() throws Exception { |
| IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment()); |
| assertEquals(2, countMacroRefs(tu)); |
| |
| IASTSimpleDeclaration decl= getDeclaration(tu, 0); |
| assertEquals(1, countMacroRefs(decl)); |
| |
| IASTEqualsInitializer init= (IASTEqualsInitializer) decl.getDeclarators()[0].getInitializer(); |
| assertEquals(1, countMacroRefs(init)); |
| |
| IASTUnaryExpression expr= (IASTUnaryExpression) init.getInitializerClause(); |
| assertEquals(0, countMacroRefs(expr)); |
| } |
| |
| private int countMacroRefs(IASTNode node) { |
| int count = 0; |
| for (IASTNodeLocation loc : node.getNodeLocations()) { |
| if (loc instanceof IASTMacroExpansionLocation) |
| count++; |
| } |
| return count; |
| } |
| |
| // typedef struct { int x; } A; |
| // |
| // void (*function(A *a))(void) { |
| // a->x; |
| // } |
| public void testFunctionReturningFunctionPointer_413204() throws Exception { |
| parseAndCheckBindings(); |
| } |
| |
| // double d = 00.9; |
| public void testOctalFloatingPointLiteral_394048() throws Exception { |
| parseAndCheckBindings(); |
| } |
| |
| public void testMacOS9LineEnding_151329a() throws Exception { |
| parseAndCheckBindings("int waldo;\r#define bar"); |
| } |
| |
| public void testMaxOS9LineEnding_151329b() throws Exception { |
| // This tests that if there is an \r\n in a macro continuation, |
| // the \r is not treated as an extra newline. The code |
| // stringifies the macro expansion and arranges for the string |
| // length to show up in a template parameter, whose value is |
| // checked by the test. |
| String code = "#define MACRO foo\\\r\n" |
| + "bar\r\n" |
| + "#define STRINGIFY_(x) #x\r\n" |
| + "#define STRINGIFY(x) STRINGIFY_(x)\r\n" |
| + "template <int N> void f(const char (&)[N]);\r\n" |
| + "int main() { f(STRINGIFY(MACRO)); }\r\n"; |
| BindingAssertionHelper helper = new BindingAssertionHelper(code, true); |
| ICPPTemplateInstance f = helper.assertNonProblem("f(STRINGIFY", "f"); |
| // 7 characters for "foobar" + the null terminator. |
| assertEquals(7, f.getTemplateArguments()[0].getNonTypeValue().numberValue().longValue()); |
| } |
| |
| // typedef unsigned char u8; |
| // |
| // #ifndef X |
| // u8 var; |
| // #endif |
| public void testU8TokenAfterIfdef_429361() throws Exception { |
| parseAndCheckBindings(); |
| } |
| |
| // void f() |
| // { |
| // // ... |
| // void* labelPtr; |
| // labelPtr = &&foo; |
| // goto *labelPtr; |
| // foo: |
| // return; |
| // } |
| public void testExpressionLabelReference_84144() throws Exception { |
| parseAndCheckBindings(true); |
| } |
| |
| // int version = 0; |
| // int NextVersion() { |
| // return __atomic_add_fetch(&version, 1, 5); |
| // } |
| public void testAtomicBuiltin_bug456131() throws Exception { |
| parseAndCheckBindings(true); |
| } |
| |
| // void waldo(...); |
| public void testVariadicCFunction_452416() throws Exception { |
| BindingAssertionHelper bh= getAssertionHelper(C); |
| IFunction waldo = bh.assertNonProblem("waldo"); |
| assertTrue(waldo.getType().takesVarArgs()); |
| } |
| |
| // struct Foo { |
| // struct Foo* a; |
| // }; |
| // |
| // int main() { |
| // struct Foo * f = 0; |
| // (f ? f->a : ((void*) 0))->a; // second 'a' cannot be resolved |
| // return 0; |
| // } |
| public void testVoidPointerInTernaryOperator_460741() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // struct MyStruct { |
| // char* str; |
| // }; |
| // void foo() { |
| // const struct MyStruct a, b; |
| // (0 ? a : b).str; |
| // } |
| public void testCVQualifiedTypesInConversionOperator_495423() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // _Alignas(8) int x; |
| // _Alignas(int) char y; |
| // _Alignas(16) struct { int x; int y; }; |
| // _Alignas(8) enum { A, B, C }; |
| // struct S { |
| // int x; |
| // _Alignas(8) int y; |
| // }; |
| // _Alignas(32) struct S s; |
| // _Alignas(struct S) int t; |
| public void testAlignas_451082() throws Exception { |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| // void foo(int waldo) { |
| // (waldo = 5) && waldo; |
| // } |
| public void testTypeIdWithEqualsInitializer_484824() throws Exception { |
| // Test that 'waldo = 5' is not parsed as a type-id, causing |
| // the entire expression to be parsed as a cast-expression. |
| // See also bug 471174, which is about the broader problem of |
| // binary && expressions with a parenthesized left operand |
| // being incorrectly parsed as cast-expressions. |
| parseAndCheckBindings(getAboveComment(), C); |
| } |
| |
| private void labelResolutionHelper(BindingAssertionHelper helper) { |
| // Make sure existing labels are resolved correctly. |
| ILabel label = helper.assertNonProblem("goto existent", "existent"); |
| assertEquals(1, helper.tu.getDeclarationsInAST(label).length); |
| label = helper.assertNonProblem("&& existent", "existent"); |
| assertEquals(1, helper.tu.getDeclarationsInAST(label).length); |
| |
| // Make sure non-existent labels are not resolved. |
| helper.assertProblem("goto nonexistent", "nonexistent"); |
| helper.assertProblem("&& nonexistent", "nonexistent"); |
| } |
| |
| // int main() { |
| // existent: |
| // int x; |
| // goto existent; |
| // goto nonexistent; |
| // void* ref1 = && existent; |
| // void* ref2 = && nonexistent; |
| // } |
| public void testLabelResolution_484979() throws Exception { |
| labelResolutionHelper(getAssertionHelper(C)); |
| labelResolutionHelper(getAssertionHelper(CPP)); |
| } |
| } |