blob: 710153ea873033936e7fd2fb43e8c0b802a1ae12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Ed Swartz (Nokia)
* Markus Schorn (Wind River Systems)
* Andrew Ferguson (Symbian)
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.core.parser.tests.ast2;
import java.io.BufferedReader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
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.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
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.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.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.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
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.ICPPNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPPointerType;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.parser.ParserException;
/**
* @author aniefer
*/
public class AST2CPPTests extends AST2BaseTest {
public AST2CPPTests() {
}
public AST2CPPTests(String name) {
super(name);
}
public static TestSuite suite() {
return suite(AST2CPPTests.class);
}
// #define CURLOPTTYPE_OBJECTPOINT 10000
// #define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number
// typedef enum {
// CINIT(FILE, OBJECTPOINT, 1),
// CINIT(URL, OBJECTPOINT, 2)
// } CURLoption ;
public void testBug102825() throws Exception {
parseAndCheckBindings(getAboveComment());
}
// class B {
// public:
// B( int t );
// };
// class A : public B {
// public:
// A( int t );
// };
// A::A( int t ) : B( t - 1 ){}
public void testBug78883() throws Exception {
parseAndCheckBindings(getAboveComment());
}
// enum type {A};
// enum type a, b;
// type c;
// enum type2 {A, B};
// enum type2 d, e;
public void testBug77967() throws Exception {
parseAndCheckBindings( getAboveComment() );
}
public void testBug75189() throws Exception {
parseAndCheckBindings( "struct A{};typedef int (*F) (A*);" ); //$NON-NLS-1$
}
public void testBug75340() throws Exception {
IASTTranslationUnit tu = parseAndCheckBindings( "void f(int i = 0, int * p = 0);"); //$NON-NLS-1$
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) tu.getDeclarations()[0];
assertEquals( ASTSignatureUtil.getParameterSignature( sd.getDeclarators()[0] ), "(int, int *)" ); //$NON-NLS-1$
}
// #define REF_WRAP(e) class A { public: A (){ } A& foo2(e& v) { return *this; } }
// class B
// {
// REF_WRAP(B);
// B();
// void foo();
// };
public void testBug79540() throws Exception {
parseAndCheckBindings( getAboveComment() );
}
// template <class T, int someConst=0>
// class WithTemplate {};
// int main ()
// {
// WithTemplate <int, 10> normalInstance;
// const int localConst=10;
// WithTemplate <int, localConst> brokenInstance;
// return 0;
// }
public void testBug103578() throws Exception {
parseAndCheckBindings( getAboveComment() );
}
// 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() );
}
// signed int si(0);
// unsigned u(10U);
// signed s(-1);
// short sh(0);
// long l(0L);
// long long ll(0LL);
public void testInitializeUnsigned_Bug245070() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP, true);
}
public void testBug43579() throws Exception {
parseAndCheckBindings("class A { int m; }; \n A * a; int A::*pm; \n int f(){} \n int f(int); \n int x = f(a->*pm);"); //$NON-NLS-1$
parseAndCheckBindings("class A { int m; }; \n A * a; int A::*pm; \n int f(){} \n int f(int); \n int x = f(a->*pm);"); //$NON-NLS-1$
}
// class A { int m(int); };
// A a;
// int (A::*pm)(int) = &A::m;
// int f(){}
// int f(int);
// int x = f((a.*pm)(5));
public void testBug43242() throws Exception {
parseAndCheckBindings( getAboveComment() );
}
public void testBug43241() throws Exception {
parseAndCheckBindings( "int m(int); int (*pm)(int) = &m; int f(){} int f(int); int x = f((*pm)(5));" ); //$NON-NLS-1$
}
// int *zzz1 (char);
// int (*zzz2) (char);
// int ((*zzz3)) (char);
// int (*(zzz4)) (char);
public void testBug40768() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
}
protected IASTTranslationUnit parseAndCheckBindings( String code ) throws Exception
{
IASTTranslationUnit tu = parse( code, ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
return tu;
}
public void testBug40422() throws Exception
{
IASTTranslationUnit tu = parse( "class A { int y; }; int A::* x = 0;", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
}
public void testBug86282() throws Exception {
IASTTranslationUnit tu = parse( "void foo() { int (* f[])() = new (int (*[10])()); }", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
}
// bool f() {
// int first, last;
// if(first < 1 || last > 99 )
// return false;
// }
public void testBug75858() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
}
public void testBug95424() throws Exception {
IASTTranslationUnit tu = parse( "void f(){ traits_type::copy(__r->_M_refdata(), __buf, __i); }", ParserLanguage.CPP, true, true ); //$NON-NLS-1$
tu = parse( "void f(){ traits_type::copy(__r->_M_refdata(), __buf, __i); }", ParserLanguage.CPP, false, true ); //$NON-NLS-1$
IASTFunctionDefinition f = (IASTFunctionDefinition) tu.getDeclarations()[0];
IASTCompoundStatement cs = (IASTCompoundStatement) f.getBody();
IASTExpressionStatement es = (IASTExpressionStatement) cs.getStatements()[0];
assertTrue( es.getExpression() instanceof IASTFunctionCallExpression );
}
// class A { } a;
public void testSimpleClass() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
IASTCompositeTypeSpecifier compTypeSpec = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = compTypeSpec.getName();
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_a = dtor.getName();
ICompositeType A = (ICompositeType) name_A.resolveBinding();
IVariable a = (IVariable) name_a.resolveBinding();
ICompositeType A_2 = (ICompositeType) a.getType();
assertNotNull(A);
assertNotNull(a);
assertSame(A, A_2);
}
// class A {
// public:
// int x;
// A * next;
// };
// A * start;
// void test() {
// for(A *y = start; y->x != 0; y = y->next) {
// 42;
// }
// for(int x = 0 ; x < 10; x++ ) {
// }
// }
public void testBug95411() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector nameCol = new CPPNameCollector();
tu.accept( nameCol );
assertNoProblemBindings( nameCol );
}
// class A; class A {};
public void testClassForwardDecl() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
IASTElaboratedTypeSpecifier elabSpec = (IASTElaboratedTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_elab = elabSpec.getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
assertEquals(decl.getDeclarators().length, 0);
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_comp = compSpec.getName();
ICompositeType A = (ICompositeType) name_elab.resolveBinding();
ICompositeType A_2 = (ICompositeType) name_comp.resolveBinding();
assertNotNull(A);
assertSame(A, A_2);
}
// class A {}; A a;
public void testVariable() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
IASTCompositeTypeSpecifier compType = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = compType.getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_a = dtor.getName();
IASTNamedTypeSpecifier namedSpec = (IASTNamedTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A2 = namedSpec.getName();
IVariable a = (IVariable) name_a.resolveBinding();
ICompositeType A1 = (ICompositeType) a.getType();
ICompositeType A2 = (ICompositeType) name_A2.resolveBinding();
ICompositeType A = (ICompositeType) name_A.resolveBinding();
assertNotNull(a);
assertNotNull(A);
assertSame(A, A1);
assertSame(A1, A2);
}
// class A { int f; };
public void testField() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
ICPPASTCompositeTypeSpecifier comp = (ICPPASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = comp.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_f = dtor.getName();
ICPPClassType A = (ICPPClassType) name_A.resolveBinding();
IField f = (IField) name_f.resolveBinding();
assertNotNull(A);
assertNotNull(f);
assertSame(f.getScope(), A.getCompositeScope());
}
// class A { int f(); };
public void testMethodDeclaration() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
IASTCompositeTypeSpecifier comp = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = comp.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_f = dtor.getName();
ICPPClassType A = (ICPPClassType) name_A.resolveBinding();
ICPPMethod f = (ICPPMethod) name_f.resolveBinding();
assertNotNull(A);
assertNotNull(f);
assertSame(f.getScope(), A.getCompositeScope());
}
// class A { void f(); };
// void A::f() { }
public void testMethodDefinition() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
IASTCompositeTypeSpecifier comp = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = comp.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_f1 = dtor.getName();
IASTFunctionDefinition def = (IASTFunctionDefinition) tu
.getDeclarations()[1];
IASTFunctionDeclarator fdtor = def.getDeclarator();
ICPPASTQualifiedName name_f2 = (ICPPASTQualifiedName) fdtor.getName();
ICPPClassType A = (ICPPClassType) name_A.resolveBinding();
ICPPMethod f1 = (ICPPMethod) name_f1.resolveBinding();
ICPPMethod f2 = (ICPPMethod) name_f2.resolveBinding();
IASTName[] names = name_f2.getNames();
assertEquals(names.length, 2);
IASTName qn1 = names[0];
IASTName qn2 = names[1];
ICPPClassType A2 = (ICPPClassType) qn1.resolveBinding();
ICPPMethod f3 = (ICPPMethod) qn2.resolveBinding();
assertNotNull(A);
assertNotNull(f1);
assertSame(f1, f2);
assertSame(f2, f3);
assertSame(A, A2);
}
// class A { void f(); int i; };
// void A::f() { i; }
public void testMemberReference() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
assertEquals(decl.getDeclarators().length, 0);
IASTCompositeTypeSpecifier comp = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A = comp.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTDeclarator dtor = decl.getDeclarators()[0];
IASTName name_f1 = dtor.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[1];
dtor = decl.getDeclarators()[0];
IASTName name_i = dtor.getName();
IASTFunctionDefinition def = (IASTFunctionDefinition) tu
.getDeclarations()[1];
IASTFunctionDeclarator fdtor = def.getDeclarator();
ICPPASTQualifiedName name_f2 = (ICPPASTQualifiedName) fdtor.getName();
IASTCompoundStatement compound = (IASTCompoundStatement) def.getBody();
IASTExpressionStatement statement = (IASTExpressionStatement) compound
.getStatements()[0];
IASTIdExpression idExp = (IASTIdExpression) statement.getExpression();
IASTName name_i2 = idExp.getName();
ICPPClassType A = (ICPPClassType) name_A.resolveBinding();
ICPPMethod f1 = (ICPPMethod) name_f1.resolveBinding();
ICPPMethod f2 = (ICPPMethod) name_f2.resolveBinding();
ICPPField i1 = (ICPPField) name_i.resolveBinding();
ICPPField i2 = (ICPPField) name_i2.resolveBinding();
IASTName[] names = name_f2.getNames();
assertEquals(names.length, 2);
IASTName qn1 = names[0];
IASTName qn2 = names[1];
ICPPClassType A2 = (ICPPClassType) qn1.resolveBinding();
ICPPMethod f3 = (ICPPMethod) qn2.resolveBinding();
assertNotNull(A);
assertNotNull(f1);
assertNotNull(i1);
assertSame(f1, f2);
assertSame(f2, f3);
assertSame(A, A2);
assertSame(i1, i2);
}
// class A { int i; };
// class B : public A { void f(); };
// void B::f() { i; }
public void testBasicInheritance() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
ICPPASTCompositeTypeSpecifier comp = (ICPPASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
IASTName name_A1 = comp.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTName name_i1 = decl.getDeclarators()[0].getName();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
comp = (ICPPASTCompositeTypeSpecifier) decl.getDeclSpecifier();
IASTName name_B1 = comp.getName();
ICPPASTBaseSpecifier base = comp.getBaseSpecifiers()[0];
IASTName name_A2 = base.getName();
decl = (IASTSimpleDeclaration) comp.getMembers()[0];
IASTName name_f1 = decl.getDeclarators()[0].getName();
IASTFunctionDefinition def = (IASTFunctionDefinition) tu
.getDeclarations()[2];
ICPPASTQualifiedName name_f2 = (ICPPASTQualifiedName) def
.getDeclarator().getName();
IASTName name_B2 = name_f2.getNames()[0];
IASTName name_f3 = name_f2.getNames()[1];
IASTCompoundStatement compound = (IASTCompoundStatement) def.getBody();
IASTExpressionStatement statement = (IASTExpressionStatement) compound
.getStatements()[0];
IASTIdExpression idExp = (IASTIdExpression) statement.getExpression();
IASTName name_i2 = idExp.getName();
ICPPField i2 = (ICPPField) name_i2.resolveBinding();
ICPPField i1 = (ICPPField) name_i1.resolveBinding();
ICPPClassType A2 = (ICPPClassType) name_A2.resolveBinding();
ICPPClassType A1 = (ICPPClassType) name_A1.resolveBinding();
ICPPClassType B2 = (ICPPClassType) name_B2.resolveBinding();
ICPPClassType B1 = (ICPPClassType) name_B1.resolveBinding();
ICPPMethod f3 = (ICPPMethod) name_f3.resolveBinding();
ICPPMethod f2 = (ICPPMethod) name_f2.resolveBinding();
ICPPMethod f1 = (ICPPMethod) name_f1.resolveBinding();
assertNotNull(A1);
assertNotNull(B1);
assertNotNull(i1);
assertNotNull(f1);
assertSame(A1, A2);
assertSame(B1, B2);
assertSame(i1, i2);
assertSame(f1, f2);
assertSame(f2, f3);
}
// namespace A{
// int a;
// }
// namespace B{
// using namespace A;
// }
// namespace C{
// using namespace A;
// }
//
// namespace BC{
// using namespace B;
// using namespace C;
// }
//
// void f(){
// BC::a++; //ok
// }
public void testNamespaces() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 13);
ICPPNamespace A = (ICPPNamespace) collector.getName(0).resolveBinding();
IVariable a = (IVariable) collector.getName(1).resolveBinding();
ICPPNamespace B = (ICPPNamespace) collector.getName(2).resolveBinding();
ICPPNamespace C = (ICPPNamespace) collector.getName(4).resolveBinding();
ICPPNamespace BC = (ICPPNamespace) collector.getName(6)
.resolveBinding();
IFunction f = (IFunction) collector.getName(9).resolveBinding();
assertInstances(collector, A, 3);
assertInstances(collector, a, 3);
assertInstances(collector, B, 2);
assertInstances(collector, C, 2);
assertInstances(collector, BC, 2);
assertInstances(collector, f, 1);
}
// int A;
// class A {};
// void f() {
// A++;
// class A a;
// }
public void testNameHiding() throws Exception {
String content= getAboveComment();
IASTTranslationUnit tu = parse(content, ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 6);
IVariable vA = (IVariable) collector.getName(0).resolveBinding();
ICompositeType cA = (ICompositeType) collector.getName(1)
.resolveBinding();
IVariable a = (IVariable) collector.getName(5).resolveBinding();
assertSame(a.getType(), cA);
assertInstances(collector, vA, 2);
assertInstances(collector, cA, 2);
tu = parse(content, ParserLanguage.CPP);
collector = new CPPNameCollector();
tu.accept(collector);
cA = (ICompositeType) collector.getName(1).resolveBinding();
IBinding A = collector.getName(3).resolveBinding();
vA = (IVariable) collector.getName(0).resolveBinding();
assertSame(vA, A);
}
// class A { void f(); };
// class B;
// void A::f() {
// B b;
// }
// int B;
public void testBlockTraversal() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 9);
ICompositeType A = (ICompositeType) collector.getName(0)
.resolveBinding();
ICPPMethod f = (ICPPMethod) collector.getName(1).resolveBinding();
ICompositeType B = (ICompositeType) collector.getName(2)
.resolveBinding();
IVariable b = (IVariable) collector.getName(7).resolveBinding();
IVariable B2 = (IVariable) collector.getName(8).resolveBinding();
assertSame(b.getType(), B);
assertInstances(collector, A, 2);
assertInstances(collector, f, 3);
assertInstances(collector, B, 2);
assertInstances(collector, b, 1);
assertInstances(collector, B2, 1);
}
// void f( int i );
// void f( char c );
// void main() {
// f( 1 ); //calls f( int );
// f( 'b' );
// }
public void testFunctionResolution() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IFunction f1 = (IFunction) collector.getName(0).resolveBinding();
IFunction f2 = (IFunction) collector.getName(2).resolveBinding();
assertInstances(collector, f1, 2);
assertInstances(collector, f2, 2);
}
// typedef struct {
// int x;
// } S;
// void f() {
// S myS;
// myS.x = 5;
// }
public void testSimpleStruct() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType anonStruct = (ICPPClassType) collector.getName(0)
.resolveBinding();
ICPPField x = (ICPPField) collector.getName(1).resolveBinding();
ITypedef S = (ITypedef) collector.getName(2).resolveBinding();
IFunction f = (IFunction) collector.getName(3).resolveBinding();
IVariable myS = (IVariable) collector.getName(5).resolveBinding();
assertInstances(collector, anonStruct, 1);
assertInstances(collector, x, 2);
assertInstances(collector, S, 2);
assertInstances(collector, f, 1);
assertInstances(collector, myS, 2);
}
// struct A;
// void f(){
// struct A;
// struct A * a;
// }
public void testStructureTags_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType A1 = (ICPPClassType) collector.getName(0)
.resolveBinding();
ICPPClassType A2 = (ICPPClassType) collector.getName(2)
.resolveBinding();
IVariable a = (IVariable) collector.getName(4).resolveBinding();
assertNotNull(a);
assertNotNull(A1);
assertNotNull(A2);
assertNotSame(A1, A2);
assertInstances(collector, A1, 1);
assertInstances(collector, A2, 2);
}
// struct A;
// void f(){
// struct A * a;
// }
public void testStructureTags_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType A1 = (ICPPClassType) collector.getName(0)
.resolveBinding();
ICPPClassType A2 = (ICPPClassType) collector.getName(2)
.resolveBinding();
IVariable a = (IVariable) collector.getName(3).resolveBinding();
assertNotNull(a);
assertNotNull(A1);
assertNotNull(A2);
assertSame(A1, A2);
assertInstances(collector, A1, 2);
}
// struct A;
// struct A * a;
// struct A { int i; };
// void f() {
// a->i;
// }
public void testStructureDef() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType A1 = (ICPPClassType) collector.getName(0)
.resolveBinding();
IVariable a = (IVariable) collector.getName(2).resolveBinding();
ICPPField i = (ICPPField) collector.getName(4).resolveBinding();
assertInstances(collector, A1, 3);
assertInstances(collector, a, 2);
assertInstances(collector, i, 2);
}
// struct x {};
// void f( int x ) {
// struct x i;
// }
public void testStructureNamespace() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType x = (ICPPClassType) collector.getName(0).resolveBinding();
assertInstances(collector, x, 2);
}
// void f( int a );
// void f( int b ){
// b;
// }
public void testFunctionDef() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IFunction f = (IFunction) collector.getName(0).resolveBinding();
IParameter a = (IParameter) collector.getName(1).resolveBinding();
assertInstances(collector, f, 2);
assertInstances(collector, a, 3);
IScope scope = a.getScope();
assertNotNull(scope);
assertSame(scope.getParent(), f.getScope());
}
// void f();
// void g() {
// f();
// }
// void f(){ }
public void testSimpleFunctionCall() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IFunction f = (IFunction) collector.getName(0).resolveBinding();
IFunction g = (IFunction) collector.getName(1).resolveBinding();
assertInstances(collector, f, 3);
assertInstances(collector, g, 1);
}
// void f() {
// for( int i = 0; i < 5; i++ ) {
// i;
// }
// }
public void testForLoop() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IVariable i = (IVariable) collector.getName(1).resolveBinding();
assertInstances(collector, i, 4);
}
// struct A { int x; };
// void f(){
// ((struct A *) 1)->x;
// }
public void testExpressionFieldReference() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType A = (ICPPClassType) collector.getName(0).resolveBinding();
IField x = (IField) collector.getName(1).resolveBinding();
assertInstances(collector, A, 2);
assertInstances(collector, x, 2);
}
// 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(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IEnumeration hue = (IEnumeration) collector.getName(0).resolveBinding();
IEnumerator red = (IEnumerator) collector.getName(1).resolveBinding();
IEnumerator blue = (IEnumerator) collector.getName(2).resolveBinding();
IEnumerator green = (IEnumerator) collector.getName(3).resolveBinding();
IVariable col = (IVariable) collector.getName(5).resolveBinding();
IVariable cp = (IVariable) collector.getName(6).resolveBinding();
assertInstances(collector, hue, 2);
assertInstances(collector, red, 2);
assertInstances(collector, blue, 2);
assertInstances(collector, green, 1);
assertInstances(collector, col, 3);
assertInstances(collector, cp, 3);
assertTrue(cp.getType() instanceof IPointerType);
IPointerType pt = (IPointerType) cp.getType();
assertSame(pt.getType(), hue);
}
public void testPointerToFunction() throws Exception {
IASTTranslationUnit tu = parse("int (*pfi)();", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IVariable pf = (IVariable) collector.getName(0).resolveBinding();
IPointerType pt = (IPointerType) pf.getType();
assertTrue(pt.getType() instanceof IFunctionType);
tu = parse(
"struct A; int (*pfi)( int, struct A * );", ParserLanguage.CPP); //$NON-NLS-1$
collector = new CPPNameCollector();
tu.accept(collector);
ICPPClassType A = (ICPPClassType) collector.getName(0).resolveBinding();
pf = (IVariable) collector.getName(1).resolveBinding();
pt = (IPointerType) pf.getType();
assertTrue(pt.getType() instanceof IFunctionType);
IFunctionType ft = (IFunctionType) pt.getType();
IType[] params = ft.getParameterTypes();
assertTrue(params[0] instanceof IBasicType);
assertTrue(params[1] instanceof IPointerType);
pt = (IPointerType) params[1];
assertSame(pt.getType(), A);
}
// struct A;
// int * f( int i, char c );
// void ( *g ) ( A * );
// void (* (*h)(A**) ) ( int );
public void testFunctionTypes() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
IASTElaboratedTypeSpecifier elabSpec = (IASTElaboratedTypeSpecifier) decl
.getDeclSpecifier();
ICompositeType A = (ICompositeType) elabSpec.getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[1];
IFunction f = (IFunction) decl.getDeclarators()[0].getName()
.resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[2];
IVariable g = (IVariable) decl.getDeclarators()[0]
.getNestedDeclarator().getName().resolveBinding();
decl = (IASTSimpleDeclaration) tu.getDeclarations()[3];
IVariable h = (IVariable) decl.getDeclarators()[0]
.getNestedDeclarator().getNestedDeclarator().getName()
.resolveBinding();
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);
}
public void testFnReturningPtrToFn() throws Exception {
IASTTranslationUnit tu = parse(
"void ( * f( int ) )(){}", ParserLanguage.CPP); //$NON-NLS-1$
IASTFunctionDefinition def = (IASTFunctionDefinition) tu
.getDeclarations()[0];
IFunction f = (IFunction) def.getDeclarator().getName().resolveBinding();
IFunctionType ft = f.getType();
assertTrue(ft.getReturnType() instanceof IPointerType);
assertTrue(((IPointerType) ft.getReturnType()).getType() instanceof IFunctionType);
assertEquals(ft.getParameterTypes().length, 1);
}
// void f();
// namespace A {
// void g();
// }
// namespace X {
// using ::f;
// using A::g;
// }
// void h() {
// X::f();
// X::g();
// }
public void testUsingDeclaration_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IFunction f = (IFunction) collector.getName(0).resolveBinding();
ICPPNamespace A = (ICPPNamespace) collector.getName(1).resolveBinding();
IFunction g = (IFunction) collector.getName(2).resolveBinding();
ICPPNamespace X = (ICPPNamespace) collector.getName(3).resolveBinding();
ICPPUsingDeclaration using = (ICPPUsingDeclaration) collector
.getName(5).resolveBinding();
IBinding[] delegates = using.getDelegates();
assertEquals(delegates.length, 1);
assertSame(delegates[0], f);
assertInstances(collector, delegates[0], 3); // decl + using-decl + ref
assertInstances(collector, A, 2);
assertInstances(collector, X, 3);
ICPPUsingDeclaration using_g = (ICPPUsingDeclaration) collector
.getName(8).resolveBinding();
assertSame(using_g.getDelegates()[0], g);
assertInstances(collector, using_g.getDelegates()[0], 3); // decl + using-decl + ref
}
// typedef int Int;
// void f( int i );
// void f( const int );
// void f( Int i );
// void g( char * );
// void g( char [] );
// void h( int(a)() );
// void h( int (*) () );
public void testFunctionDeclarations() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IFunction f = (IFunction) collector.getName(1).resolveBinding();
isTypeEqual(f.getType(), "void (int)");
IFunction g = (IFunction) collector.getName(8).resolveBinding();
isTypeEqual(g.getType(), "void (char *)");
IFunction h = (IFunction) collector.getName(12).resolveBinding();
isTypeEqual(h.getType(), "void (int () *)");
assertInstances(collector, f, 3);
assertInstances(collector, g, 2);
assertInstances(collector, h, 2);
}
// class P1 { public: int x; };
// class P2 { public: int x; };
// class B : public P1, public P2 {};
// void main() {
// B * b = new B();
// b->x;
// }
public void testProblem_AmbiguousInParent() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
IProblemBinding x = (IProblemBinding) collector.getName(12)
.resolveBinding();
assertEquals(x.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP);
}
// class D { public: int x; };
// class C : public virtual D {};
// class B : public virtual D {};
// class A : public B, public C {};
// void main() {
// A * a = new A();
// a->x;
// }
public void testVirtualParentLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 15);
ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding();
ICPPField x = (ICPPField) collector.getName(1).resolveBinding();
ICPPClassType C = (ICPPClassType) collector.getName(2).resolveBinding();
ICPPClassType B = (ICPPClassType) collector.getName(4).resolveBinding();
ICPPClassType A = (ICPPClassType) collector.getName(6).resolveBinding();
ICPPConstructor ctor = A.getConstructors()[0];
assertInstances(collector, D, 3);
assertInstances(collector, C, 2);
assertInstances(collector, B, 2);
assertInstances(collector, A, 2);
assertInstances(collector, ctor, 1);
assertInstances(collector, x, 2);
}
// class D { public: int x; };
// class C : public D {};
// class B : public D {};
// class A : public B, public C {};
// void main() {
// A * a = new A();
// a->x;
// }
public void testAmbiguousVirtualParentLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 15);
ICPPClassType D = (ICPPClassType) collector.getName(0).resolveBinding();
ICPPField x1 = (ICPPField) collector.getName(1).resolveBinding();
ICPPClassType C = (ICPPClassType) collector.getName(2).resolveBinding();
ICPPClassType B = (ICPPClassType) collector.getName(4).resolveBinding();
ICPPClassType A = (ICPPClassType) collector.getName(6).resolveBinding();
ICPPConstructor ctor = A.getConstructors()[0];
IProblemBinding x2 = (IProblemBinding) collector.getName(14)
.resolveBinding();
assertEquals(x2.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP);
assertInstances(collector, D, 3);
assertInstances(collector, C, 2);
assertInstances(collector, B, 2);
assertInstances(collector, A, 2);
assertInstances(collector, ctor, 1);
assertInstances(collector, x1, 1);
}
// namespace A {
// int x;
// }
// int x;
// namespace A {
// void f() { x; }
// }
public void testExtendedNamespaces() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector collector = new CPPNameCollector();
tu.accept(collector);
assertEquals(collector.size(), 6);
ICPPNamespace A = (ICPPNamespace) collector.getName(0).resolveBinding();
IVariable x1 = (IVariable) collector.getName(1).resolveBinding();
IVariable x2 = (IVariable) collector.getName(2).resolveBinding();
assertInstances(collector, A, 2);
assertInstances(collector, x1, 2);
assertInstances(collector, x2, 1);
}
// class A { };
public void testImplicitConstructors() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
assertEquals(ctors.length, 2);
assertEquals(ctors[0].getParameters().length, 1);
IType t = ctors[0].getParameters()[0].getType();
assertTrue(t instanceof IBasicType);
assertEquals(((IBasicType) t).getType(), IBasicType.t_void);
assertEquals(ctors[1].getParameters().length, 1);
t = ctors[1].getParameters()[0].getType();
assertTrue(t instanceof ICPPReferenceType);
assertTrue(((ICPPReferenceType) t).getType() instanceof IQualifierType);
IQualifierType qt = (IQualifierType) ((ICPPReferenceType) t).getType();
assertTrue(qt.isConst());
assertSame(qt.getType(), A);
}
// class A { A(void); A( const A & ); };
public void testConstructors() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl
.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
assertEquals(ctors.length, 2);
assertEquals(ctors[0].getParameters().length, 1);
assertEquals(ctors[1].getParameters().length, 1);
IType t = ctors[1].getParameters()[0].getType();
assertTrue(t instanceof ICPPReferenceType);
assertTrue(((ICPPReferenceType) t).getType() instanceof IQualifierType);
IQualifierType qt = (IQualifierType) ((ICPPReferenceType) t).getType();
assertTrue(qt.isConst());
assertSame(qt.getType(), A);
}
// class A {~A(); };
// class B {~B(void); };
public void testExplicitDestructor_183160() throws Exception {
// class F {(~)F(); };
// class G {(~)G(void); };
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPMethod[] methods = ((ICPPClassScope)A.getCompositeScope()).getImplicitMethods();
assertNotNull(methods);
int count=0;
for (ICPPMethod method : methods)
count+= method.getName().startsWith("~") ? 1 : 0;
assertEquals(line, 0, count);
methods = A.getDeclaredMethods();
assertNotNull(methods);
count=0;
for (ICPPMethod method : methods)
count+= method.getName().startsWith("~") ? 1 : 0;
assertEquals(line, 1, count);
}
}
// class C {};
// class D {D();};
// class E {E(void);};
public void testImplicitDestructor_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPMethod[] methods = ((ICPPClassScope)A.getCompositeScope()).getImplicitMethods();
assertNotNull(methods);
int count=0;
for (ICPPMethod method : methods)
count+= method.getName().startsWith("~") ? 1 : 0;
assertEquals(line, 1, count);
methods = A.getDeclaredMethods();
assertNotNull(methods);
count=0;
for (ICPPMethod method : methods)
count+= method.getName().startsWith("~") ? 1 : 0;
assertEquals(line, 0, count);
}
}
// class A {public: A();};
// class B {public: B() {}};
// class C {public: C() {}};
// class D {public: D(void) {}};
// class E {protected: E();};
// class F {protected: F() {}};
// class G {protected: G() {}};
// class H {protected: H(void) {}};
// class I {private: I();};
// class J {private: J() {}};
// class K {private: K() {}};
// class L {private: L(void) {}};
// class M {M();};
// class N {N() {}};
// class O {O() {}};
// class P {P(void) {}};
// class Q {public: Q(int k=5);};
// class R {public: R(int k=5, long k=4);};
// class S {public: S(int k=5, int* ip= 0);};
// class T {public: T(int k=5, int* ip= 0, T* t= 0);};
public void testExplicitDefaultConstructor_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
assertEquals(2, ctors.length); // one user-declared default constructor, one implicit copy constructor
}
}
// class Q {public: Q(int k);};
// class R {public: R(int k=5, long k);};
// class S {public: S(int k=5, int* ip);};
// class T {public: T(int k, int* ip= 0, T* t= 0);};
public void testExplicitNonDefaultConstructor_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
assertEquals(2, ctors.length); // one user-declared non-default constructor, one implicit copy constructor
}
}
// class A {public: A(A &);};
// class B {private: B(const B &);};
// class C {protected: C(volatile C &);};
// class D {D(const volatile D &) {}};
// class E {public: E(E &, int k=5);};
// class F {private: F(const F &, int j=2, int k=3);};
// class G {protected: G(volatile G &, int i=4, int l=2);};
// class H {H(const volatile H &, int i=1, long k=2) {}};
public void testExplicitCopyConstructor_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
// one copy constructor, no implicit default constructor
assertEquals(1, ctors.length);
}
}
// class I {public: I(I *, int k=5);}; // I * rather than I &
// class J {private: J(const J *, int j, int k=3);}; // J * rather than J &
// class K {protected: K(volatile K *, int i=4, int l=2);}; // K * rather than K &
// class L {L(const volatile L &, int i=1, long k=2, int* x) {}}; // param int* x has no initializer
public void testNotExplicitCopyConstructor_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertNotNull(ctors);
// one copy constructor, one user declared constructor (not a copy constructor)
assertEquals(2, ctors.length);
}
}
// class A {public: void operator=(int); }; // legitimate, but not a copy assignment operator
// class B {public: void operator=(B &, int); }; // compile error
// class C {public: void operator=(C &c, int k=5) {} }; // compile error
// class D {public: void operator=(const D &, const D &); }; // compile error
public void testNotExplicitCopyAssignmentOperator_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPMethod[] methods = ((ICPPClassScope)A.getCompositeScope()).getImplicitMethods();
assertNotNull(methods);
int count=0;
for (ICPPMethod method : methods) {
boolean eq= Arrays.equals(method.getName().toCharArray(), OverloadableOperator.ASSIGN.toCharArray());
count+= eq ? 1 : 0;
}
assertEquals(1, count); // check for one implicit operator= method
methods = A.getDeclaredMethods();
assertNotNull(methods);
count=0;
for (ICPPMethod method : methods) {
boolean eq= Arrays.equals(method.getName().toCharArray(), OverloadableOperator.ASSIGN.toCharArray());
count+= eq ? 1 : 0;
}
assertEquals(1, count); // check for the user declared
}
}
// class A {public: void operator=(A &); };
// class B {protected: void operator=(const B &); };
// class C {private: void operator=(volatile C &) {} };
// class D {D& operator=(volatile const D &); };
public void testExplicitCopyAssignmentOperator_183160() throws Exception {
BufferedReader br= new BufferedReader(new StringReader(getAboveComment()));
for(String line= br.readLine(); line!=null; line= br.readLine()) {
IASTTranslationUnit tu = parse(line, ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTCompositeTypeSpecifier compSpec = (IASTCompositeTypeSpecifier) decl.getDeclSpecifier();
ICPPClassType A = (ICPPClassType) compSpec.getName().resolveBinding();
ICPPMethod[] methods = ((ICPPClassScope)A.getCompositeScope()).getImplicitMethods();
assertNotNull(methods);
int count=0;
for (ICPPMethod method : methods) {
boolean eq= Arrays.equals(method.getName().toCharArray(), OverloadableOperator.ASSIGN.toCharArray());
count+= eq ? 1 : 0;
}
assertEquals(0, count); // check for no implicit operator= methods
methods = A.getDeclaredMethods();
assertNotNull(methods);
count=0;
for (ICPPMethod method : methods) {
boolean eq= Arrays.equals(method.getName().toCharArray(), OverloadableOperator.ASSIGN.toCharArray());
count+= eq ? 1 : 0;
}
assertEquals(1, count); // only should get the user declared
}
}
// namespace A { int x; }
// namespace B = A;
// int f(){ B::x; }
public void testNamespaceAlias() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 8);
ICPPNamespace A = (ICPPNamespace) col.getName(0).resolveBinding();
IVariable x = (IVariable) col.getName(1).resolveBinding();
ICPPNamespace B = (ICPPNamespace) col.getName(2).resolveBinding();
assertTrue(B instanceof ICPPNamespaceAlias);
assertSame(((ICPPNamespaceAlias) B).getBinding(), A);
assertInstances(col, A, 2);
assertInstances(col, B, 2);
assertInstances(col, x, 3);
}
// public void testBug84250() throws Exception {
// assertTrue(((IASTDeclarationStatement) ((IASTCompoundStatement)
// ((IASTFunctionDefinition) parse(
// "void f() { int (*p) [2]; }",
// ParserLanguage.CPP).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration()
// instanceof IASTSimpleDeclaration); //$NON-NLS-1$
// }
// void f() {
// int ( *p ) [2];
// (&p)[0] = 1;
// }
public void testBug84250() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
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 testBug84250_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
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);
}
// struct s { double i; } f(void);
// struct s f(void){}
public void testBug84266() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
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);
}
public void testBug84266_2() throws Exception {
IASTTranslationUnit tu = parse("struct s f(void);", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 3);
ICompositeType s = (ICompositeType) col.getName(0).resolveBinding();
assertNotNull(s);
tu = parse("struct s f(void){}", ParserLanguage.CPP); //$NON-NLS-1$
col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 3);
s = (ICompositeType) col.getName(0).resolveBinding();
assertNotNull(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(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
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);
}
// class A { public : static int n; };
// int main() {
// int A;
// A::n = 42;
// A b;
// }
public void testBug84615() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 9);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPField n = (ICPPField) col.getName(1).resolveBinding();
IBinding Aref = col.getName(5).resolveBinding();
IBinding nref = col.getName(6).resolveBinding();
IProblemBinding prob = (IProblemBinding) col.getName(7)
.resolveBinding();
assertSame(A, Aref);
assertSame(n, nref);
assertNotNull(prob);
}
public void testBug84371() throws Exception {
String code = "int x = ::ABC::DEF::ghi;"; //$NON-NLS-1$
IASTTranslationUnit tu = parse(code, ParserLanguage.CPP);
IASTSimpleDeclaration x = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTInitializerExpression e = (IASTInitializerExpression) x
.getDeclarators()[0].getInitializer();
IASTIdExpression id = (IASTIdExpression) e.getExpression();
ICPPASTQualifiedName name = (ICPPASTQualifiedName) id.getName();
assertTrue(name.isFullyQualified());
assertEquals(name.getNames().length, 3);
assertEquals(name.getNames()[0].toString(), "ABC"); //$NON-NLS-1$
assertEquals(name.getNames()[1].toString(), "DEF"); //$NON-NLS-1$
assertEquals(name.getNames()[2].toString(), "ghi"); //$NON-NLS-1$
}
// namespace Y { void f(float); }
// namespace A { using namespace Y; void f(int); }
// namespace B { void f(char); }
// namespace AB { using namespace A; using namespace B; }
// void h(){
// AB::f(1);
// AB::f(`c`);
// }
public void testBug84679() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP,
false, false);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace Y = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPNamespace A = (ICPPNamespace) col.getName(3).resolveBinding();
ICPPNamespace B = (ICPPNamespace) col.getName(7).resolveBinding();
ICPPNamespace AB = (ICPPNamespace) col.getName(10).resolveBinding();
IFunction f = (IFunction) col.getName(16).resolveBinding();
IFunction fdef = (IFunction) col.getName(5).resolveBinding();
assertTrue(col.getName(19).resolveBinding() instanceof IProblemBinding);
assertSame(f, fdef);
// assertEquals(IProblemBinding.SEMANTIC_NAME_NOT_FOUND, f2.getID());
assertInstances(col, Y, 2);
assertInstances(col, A, 2);
assertInstances(col, B, 2);
assertInstances(col, AB, 3);
}
// struct Node {
// struct Node* Next;
// struct Data* Data;
// };
// struct Data {
// struct Node * node;
// friend struct Glob;
// };
public void testBug84692() throws Exception {
// also tests bug 234042.
CPPASTNameBase.sAllowRecursionBindings= false;
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 9);
ICPPClassType Node = (ICPPClassType) col.getName(1).resolveBinding();
ICPPClassType Data = (ICPPClassType) col.getName(3).resolveBinding();
assertSame(Data.getScope(), tu.getScope());
assertInstances(col, Node, 3);
assertInstances(col, Data, 2);
}
// namespace B { int b; }
// namespace A { using namespace B; int a; }
// namespace B { using namespace A; }
// void f() { B::a++; }
public void testBug84686() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 11);
ICPPVariable a1 = (ICPPVariable) col.getName(4).resolveBinding();
IVariable a2 = (IVariable) col.getName(10).resolveBinding();
assertSame(a1, a2);
}
// struct C {
// void f();
// const C& operator=( const C& );
// };
// const C& C::operator=( const C& other) {
// if( this != &other ) {
// this->~C();
// new (this) C(other );
// f();
// }
// return *this;
// }
public void testBug84705() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 17);
ICPPMethod f = (ICPPMethod) col.getName(1).resolveBinding();
IASTName[] refs = tu.getReferences(f);
assertEquals(1, refs.length);
assertSame(f, refs[0].resolveBinding());
ICPPClassType C = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod op = (ICPPMethod) col.getName(3).resolveBinding();
IParameter other = (IParameter) col.getName(11).resolveBinding();
ICPPMethod dtor = (ICPPMethod) col.getName(13).resolveBinding();
assertNotNull(dtor);
assertEquals(dtor.getName(), "~C"); //$NON-NLS-1$
assertInstances(col, C, 6);
assertInstances(col, op, 3);
assertInstances(col, other, 4);
}
// class A { void f(); void g() const; };
// void A::f(){ this; }
// void A::g() const { *this; }
public void testThis() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
ICPPClassType A = (ICPPClassType) ((IASTCompositeTypeSpecifier) decl
.getDeclSpecifier()).getName().resolveBinding();
IASTFunctionDefinition def = (IASTFunctionDefinition) tu
.getDeclarations()[1];
IASTExpressionStatement expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
.getBody()).getStatements()[0];
assertTrue(expStatement.getExpression() instanceof IASTLiteralExpression);
IType type = expStatement.getExpression().getExpressionType();
assertTrue(type instanceof IPointerType);
assertSame(((IPointerType) type).getType(), A);
def = (IASTFunctionDefinition) tu.getDeclarations()[2];
expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
.getBody()).getStatements()[0];
IASTUnaryExpression ue = (IASTUnaryExpression) expStatement.getExpression();
type = ue.getExpressionType();
assertTrue(type instanceof IQualifierType);
assertSame(((IQualifierType) type).getType(), A);
assertTrue(((IQualifierType) type).isConst());
}
public void testBug84710() throws Exception {
IASTTranslationUnit tu = parse("class T { T(); };", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPConstructor T = (ICPPConstructor) col.getName(1).resolveBinding();
assertTrue(CharArrayUtils.equals(T.getNameCharArray(),
"T".toCharArray())); //$NON-NLS-1$
assertEquals(T.getName(), "T"); //$NON-NLS-1$
}
// namespace NS {
// class T {};
// void f( T );
// }
// NS::T parm;
// int main() {
// f( parm );
// }
public void testArgumentDependantLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace NS = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPClassType T = (ICPPClassType) col.getName(1).resolveBinding();
IFunction f = (IFunction) col.getName(2).resolveBinding();
IVariable parm = (IVariable) col.getName(8).resolveBinding();
assertInstances(col, NS, 2);
assertInstances(col, T, 4);
assertInstances(col, f, 2);
assertInstances(col, parm, 2);
}
// namespace NS1{
// void f( void * );
// }
// namespace NS2{
// using namespace NS1;
// class B {};
// void f( void * );
// }
// class A : public NS2::B {} *a;
// int main() {
// f( a );
// }
public void testArgumentDependantLookup_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction fref = (IFunction) col.getName(14).resolveBinding();
IFunction f1 = (IFunction) col.getName(1).resolveBinding();
IFunction f2 = (IFunction) col.getName(6).resolveBinding();
assertSame(f2, fref);
assertNotNull(f1);
assertNotNull(f2);
}
// namespace { int i; } //1
// void f(){ i; }
// namespace A {
// namespace {
// int i; //2
// int j;
// }
// void g(){ i; }
// }
// using namespace A;
// void h() {
// i; //ambiguous
// A::i; //i2
// j;
// }
public void testBug84610() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(17, col.size());
IVariable i1 = (IVariable) col.getName(1).resolveBinding();
IVariable i2 = (IVariable) col.getName(6).resolveBinding();
IVariable j = (IVariable) col.getName(7).resolveBinding();
assertInstances(col, i1, 2);
assertInstances(col, i2, 4);
assertInstances(col, j, 2);
IProblemBinding problem = (IProblemBinding) col.getName(12)
.resolveBinding();
assertEquals(IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP, problem.getID());
}
// struct B {
// void mutate();
// };
// void g() {
// B* pb = new B();
// pb->mutate();
// }
public void testBug84703() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(8, col.size());
ICPPMethod mutate = (ICPPMethod) col.getName(1).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(0).resolveBinding();
IVariable pb = (IVariable) col.getName(4).resolveBinding();
assertInstances(col, pb, 2);
assertInstances(col, mutate, 2);
assertInstances(col, B, 2);
}
// struct S { int i; };
// void f() { ;
// int S::* pm = &S::i;
// }
public void testBug84469() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(9, col.size());
}
public void testPointerToMemberType() throws Exception {
IASTTranslationUnit tu = parse("struct S; int S::* pm;", //$NON-NLS-1$
ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(4, col.size());
IVariable pm = (IVariable) col.getName(3).resolveBinding();
ICPPClassType S = (ICPPClassType) col.getName(0).resolveBinding();
IType t = pm.getType();
assertNotNull(t);
assertTrue(t instanceof ICPPPointerToMemberType);
IType cls = ((ICPPPointerToMemberType) t).getMemberOfClass();
assertSame(S, cls);
assertTrue(((ICPPPointerToMemberType) t).getType() instanceof IBasicType);
}
// struct S { int i ; } *s;
// int S::* pm = &S::i;
// void f() {
// s->*pm = 1;
// }
public void testBug_PM_() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IBinding ref = col.getName(11).resolveBinding();
IVariable pm = (IVariable) col.getName(5).resolveBinding();
assertSame(pm, ref);
}
// struct S {
// int i;
// S* f();
// } *s;
// S* (S::* pm) () = &S::f;
// void foo() {
// (s->*pm)()->i;
// }
public void testBug_PM_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType S = (ICPPClassType) col.getName(0).resolveBinding();
IVariable pm = (IVariable) col.getName(8).resolveBinding();
IField i = (IField) col.getName(1).resolveBinding();
ICPPMethod f = (ICPPMethod) col.getName(3).resolveBinding();
IType t = pm.getType();
assertTrue(t instanceof ICPPPointerToMemberType);
IFunctionType ft = (IFunctionType) ((ICPPPointerToMemberType) t).getType();
IType ST = ((ICPPPointerToMemberType) t).getMemberOfClass();
assertTrue(ft.getReturnType() instanceof IPointerType);
assertSame(ST, ((IPointerType) ft.getReturnType()).getType());
assertSame(S, ST);
assertInstances(col, S, 5);
assertInstances(col, pm, 2);
assertInstances(col, i, 2);
assertInstances(col, f, 3);
}
// public void testFindTypeBinding_1() throws Exception {
// IASTTranslationUnit tu = parse(
// "int x = 5; int y(x);", ParserLanguage.CPP); //$NON-NLS-1$
//
// IASTStandardFunctionDeclarator fdtor = (IASTStandardFunctionDeclarator)
// ((IASTSimpleDeclaration) tu
// .getDeclarations()[1]).getDeclarators()[0];
// IASTName name = fdtor.getParameters()[0].getDeclarator().getName();
// IBinding binding = CPPSemantics.findTypeBinding(tu, name);
// assertNull(binding);
//
// tu = parse("struct x; int y(x);", ParserLanguage.CPP); //$NON-NLS-1$
//
// fdtor = (IASTStandardFunctionDeclarator) ((IASTSimpleDeclaration) tu
// .getDeclarations()[1]).getDeclarators()[0];
// name = ((ICPPASTNamedTypeSpecifier) fdtor.getParameters()[0]
// .getDeclSpecifier()).getName();
// binding = CPPSemantics.findTypeBinding(tu, name);
// assertNotNull(binding);
// assertTrue(binding instanceof ICPPClassType);
// }
//
// public void testFindTypeBinding_2() throws Exception {
// IASTTranslationUnit tu = parse(
// "struct B; void f() { B * bp; }", ParserLanguage.CPP); //$NON-NLS-1$
// IASTCompoundStatement compound = (IASTCompoundStatement)
// ((IASTFunctionDefinition) tu
// .getDeclarations()[1]).getBody();
// IASTBinaryExpression b = (IASTBinaryExpression)
// ((IASTExpressionStatement)compound.getStatements()[0]).getExpression();
// IBinding binding =
// ((IASTIdExpression)b.getOperand1()).getName().resolveBinding();
// // IASTSimpleDeclaration decl = (IASTSimpleDeclaration)
// ((IASTDeclarationStatement) compound
// // .getStatements()[0]).getDeclaration();
// // IBinding binding = CPPSemantics.findTypeBinding(compound,
// // ((ICPPASTNamedTypeSpecifier)decl.getDeclSpecifier()).getName());
// assertNotNull(binding);
// assertTrue(binding instanceof ICPPClassType);
// }
// struct B { };
// void g() {
// B * bp; //1
// }
public void testBug85049() throws Exception {
IASTTranslationUnit t = parse(getAboveComment(), ParserLanguage.CPP);
IASTFunctionDefinition g = (IASTFunctionDefinition) t.getDeclarations()[1];
IASTCompoundStatement body = (IASTCompoundStatement) g.getBody();
assertTrue(body.getStatements()[0] instanceof IASTDeclarationStatement);
}
// class A { public: int i; };
// class B : public A {};
// void f( int B::* );
// void g() {
// int A::* pm = &A::i;
// f( pm );
// }
public void testPMConversions() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(15).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPField i = (ICPPField) col.getName(1).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
IVariable pm = (IVariable) col.getName(11).resolveBinding();
assertInstances(col, f, 2);
assertInstances(col, A, 4);
assertInstances(col, i, 3);
assertInstances(col, B, 2);
assertInstances(col, pm, 2);
}
// namespace N {
// class A { public: int i; };
// void f( int A::* );
// }
// int N::A::* pm = &N::A::i;
// void g() {
// f( pm );
// }
public void testPMKoenig() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(16).resolveBinding();
ICPPNamespace N = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(1).resolveBinding();
assertInstances(col, f, 2);
assertInstances(col, N, 3);
assertInstances(col, A, 4);
}
// namespace M {
// class B { };
// void f( B* );
// }
// namespace N {
// class A { public: M::B * b; };
// }
// M::B* N::A::* pm = &N::A::b;
// void g() {
// N::A * a;
// f( a->*pm );
// }
public void testPMKoenig_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(27).resolveBinding();
ICPPNamespace M = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(1).resolveBinding();
ICPPNamespace N = (ICPPNamespace) col.getName(5).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(6).resolveBinding();
IVariable pm = (IVariable) col.getName(17).resolveBinding();
assertInstances(col, f, 2);
assertInstances(col, M, 3);
assertInstances(col, B, 6);
assertInstances(col, N, 4);
assertInstances(col, A, 5);
assertInstances(col, pm, 2);
}
// class A {
// friend void set();
// friend class B;
// };
// void set();
// class B{};
public void testFriend_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
IFunction set = (IFunction) col.getName(1).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
assertInstances(col, set, 2);
assertInstances(col, B, 2);
IBinding[] friends = A.getFriends();
assertEquals(2, friends.length);
assertSame(friends[0], set);
assertSame(friends[1], B);
}
// class Other {
// void m();
// class A {
// friend void set();
// friend void Other::m();
// };
public void testFriend_Bug275358() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
ICPPClassType A = bh.assertNonProblem("A", 1);
IFunction set = bh.assertNonProblem("set()", 3);
IFunction m = bh.assertNonProblem("Other::m()", 8);
IBinding[] friends = A.getFriends();
assertEquals(2, friends.length);
assertSame(friends[0], set);
assertSame(friends[1], m);
IBinding[] declaredMethods= A.getAllDeclaredMethods();
assertEquals(0, declaredMethods.length);
declaredMethods= A.getDeclaredMethods();
assertEquals(0, declaredMethods.length);
}
// class A { friend class B; friend class B; };
// class B{};
public void testBug59149() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
assertInstances(col, B, 3);
IBinding[] friends = A.getFriends();
assertEquals(friends.length, 1);
assertSame(friends[0], B);
}
// class A {
// public: class N {};
// };
// class B {
// friend class A::N;
// };
public void testBug59302() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType N = (ICPPClassType) col.getName(5).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
assertInstances(col, N, 3);
IBinding[] friends = B.getFriends();
assertEquals(friends.length, 1);
assertSame(friends[0], N);
assertEquals(A.getFriends().length, 0);
assertEquals(N.getFriends().length, 0);
}
// class A {
// friend class B *helper();
// };
public void testBug75482() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction helper = (IFunction) col.getName(2).resolveBinding();
assertSame(helper.getScope(), tu.getScope());
ICPPClassType B = (ICPPClassType) col.getName(1).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
assertSame(B.getScope(), A.getScope());
IBinding[] friends = A.getFriends();
assertEquals(friends.length, 1);
assertSame(friends[0], helper);
}
// void f( int );
// void f( char );
// void (*pf) (int) = &f;
// void foo() {
// pf = &f;
// }
public void testBug45763_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
IFunction f2 = (IFunction) col.getName(2).resolveBinding();
IVariable pf = (IVariable) col.getName(4).resolveBinding();
assertInstances(col, pf, 2);
assertInstances(col, f1, 3);
assertInstances(col, f2, 1);
}
// void f( char );
// void f( int );
// void g( void (*)( int ) ) {}
// void (*pg)( void(*)(int) );
// void foo() {
// g( &f );
// (*pg)( &f );
// }
public void testBug45763_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
IFunction f2 = (IFunction) col.getName(2).resolveBinding();
IFunction g = (IFunction) col.getName(4).resolveBinding();
IVariable pg = (IVariable) col.getName(7).resolveBinding();
assertInstances(col, f1, 1);
assertInstances(col, f2, 3);
assertInstances(col, g, 2);
assertInstances(col, pg, 2);
}
// void f( int );
// void f( char );
// void (* bar () ) ( int ) {
// return &f;
// }
public void testBug45763_3() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
IFunction f2 = (IFunction) col.getName(2).resolveBinding();
IFunction bar = (IFunction) col.getName(4).resolveBinding();
assertNotNull(bar);
assertInstances(col, f1, 2);
assertInstances(col, f2, 1);
}
// void f( int );
// void f( char );
// void foo () {
// ( void (*)(int) ) &f;
// }
public void testBug45763_4() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
IFunction f2 = (IFunction) col.getName(2).resolveBinding();
IFunction bar = (IFunction) col.getName(4).resolveBinding();
assertNotNull(bar);
assertInstances(col, f1, 2);
assertInstances(col, f2, 1);
}
// extern int g;
// int g;
// void f() { g = 1; }
public void testBug85824() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable g = (IVariable) col.getName(3).resolveBinding();
assertInstances(col, g, 3);
}
// struct A {
// int a2;
// };
// struct B : public A {
// int a1;
// void f();
// };
// int a3;
// void B::f(){
// int a4;
// a;
// }
public void testPrefixLookup() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IASTName name = col.getName(11);
assertEquals("a", name.toString());
IBinding[] bs = CPPSemantics.findBindingsForContentAssist(name, true);
// check the result
HashSet result= new HashSet();
for (IBinding binding : bs) {
result.add(binding.getName());
}
assertTrue(result.contains("a1"));
assertTrue(result.contains("a2"));
assertTrue(result.contains("a3"));
assertTrue(result.contains("a4"));
assertTrue(result.contains("A"));
assertEquals(7, bs.length); // the bindings above + 2 constructors
}
// static void f();
// void f() {}
public void testIsStatic() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(1).resolveBinding();
assertTrue(f.isStatic());
assertInstances(col, f, 2);
}
// // void f() {
// // if (__io.flags() & ios_base::showbase
// // || __i < 2 || __sign.size() > 1
// // || ((static_cast<part>(__p.field[3]) !=
// // money_base::none)
// // && __i == 2))
// // return;
// // }
// public void testBug85310() throws Exception {
// IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
// IASTFunctionDefinition f = (IASTFunctionDefinition)
// tu.getDeclarations()[0];
// IASTCompoundStatement body = (IASTCompoundStatement) f.getBody();
// IASTCPPIfStatement if_stmt = (IASTCPPIfStatement) body.getStatements()[0];
// assertNotNull( if_stmt.getCondition() );
// }
// struct B { void mutate(); };
// struct D1 : B {};
// struct D2 : B {};
// void B::mutate() {
// new (this) D2;
// }
// void g() {
// B* pb = new (p) D1;
// }
public void testBug86267() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType D1 = (ICPPClassType) col.getName(2).resolveBinding();
ICPPClassType D2 = (ICPPClassType) col.getName(4).resolveBinding();
ICPPConstructor[] ctors = D1.getConstructors();
ICPPConstructor d1_ctor = ctors[0];
ctors = D2.getConstructors();
ICPPConstructor d2_ctor = ctors[0];
assertInstances(col, d1_ctor, 1);
assertInstances(col, d2_ctor, 1);
}
// struct C {
// void f();
// const C& operator =( const C& );
// };
// const C& C::operator = ( const C& other ) {
// if( this != &other ) {
// this->~C();
// new (this) C(other);
// f();
// }
// return *this;
// }
public void testBug86269() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType C = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod f = (ICPPMethod) col.getName(1).resolveBinding();
ICPPMethod op = (ICPPMethod) col.getName(3).resolveBinding();
IParameter other = (IParameter) col.getName(5).resolveBinding();
assertInstances(col, C, 6);
assertInstances(col, f, 2);
assertInstances(col, op, 3);
assertInstances(col, other, 4);
assertEquals(other.getName(), "other"); //$NON-NLS-1$
}
// extern "C" {
// void printf( const char * );
// void sprintf( const char * );
// }
// void foo(){
// char *p;
// printf( p );
// printf( "abc" );
// }
public void testBug86279() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction r1 = (IFunction) col.getName(6).resolveBinding();
IFunction r2 = (IFunction) col.getName(8).resolveBinding();
IFunction printf = (IFunction) col.getName(0).resolveBinding();
assertSame(printf, r1);
assertSame(printf, r2);
}
// struct S;
// extern S a;
// void g( S );
// void h() {
// g( a );
// }
public void testBug86346() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType S = (ICPPClassType) col.getName(0).resolveBinding();
IFunction g = (IFunction) col.getName(3).resolveBinding();
assertInstances(col, S, 3);
assertInstances(col, g, 2);
}
public void testBug86288() throws Exception {
String code = "int *foo( int *b ) { return (int *)(b); }"; //$NON-NLS-1$
IASTTranslationUnit tu = parse(code, ParserLanguage.CPP);
IASTReturnStatement r = (IASTReturnStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
.getDeclarations()[0]).getBody()).getStatements()[0];
assertTrue(r.getReturnValue() instanceof IASTCastExpression);
}
// void foo() {
// struct B {
// int f();
// };
// int (B::*pb)() = &B::f;
// }
public void testBug84476() throws Exception {
String code = getAboveComment();
IASTFunctionDefinition foo = (IASTFunctionDefinition) parse(code,
ParserLanguage.CPP).getDeclarations()[0];
IASTDeclarationStatement decl = (IASTDeclarationStatement) ((IASTCompoundStatement) foo
.getBody()).getStatements()[1];
IASTSimpleDeclaration pb = (IASTSimpleDeclaration) decl
.getDeclaration();
IASTDeclarator d = pb.getDeclarators()[0];
assertEquals(d.getNestedDeclarator().getPointerOperators().length, 1);
assertEquals(d.getNestedDeclarator().getName().toString(), "pb"); //$NON-NLS-1$
assertTrue(d.getNestedDeclarator().getPointerOperators()[0] instanceof ICPPASTPointerToMember);
}
// struct T1 {
// T1 operator() ( int x ) {
// return T1(x);
// }
// T1( int ) {}
// };
public void testBug86336() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPConstructor T1_ctor = (ICPPConstructor) col.getName(6)
.resolveBinding();
ICPPClassType T1 = (ICPPClassType) col.getName(0).resolveBinding();
assertInstances(col, T1_ctor, 2);
assertInstances(col, T1, 2);
}
// struct S { int i; };
// void foo() {
// int S::* pm = &S::i;
// }
public void testBug86306() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType S = (ICPPClassType) col.getName(0).resolveBinding();
assertInstances(col, S, 3);
IASTName[] refs = tu.getReferences(S);
assertEquals(refs.length, 2);
assertSame(refs[0], col.getName(4));
assertSame(refs[1], col.getName(7));
}
// class A {
// public:
// template <class T> void f(T);
// template <class T> struct X { };
// };
// class B : public A {
// public:
// using A::f<double>; // illformed
// using A::X<int>; // illformed
// };
public void testBug86372() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
}
// void foo() {
// int i = 42;
// int a[10];
// for( int i = 0; i < 10; i++ )
// a[i] = 1;
// int j = i;
// }
public void testBug86319() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable i1 = (IVariable) col.getName(1).resolveBinding();
IVariable i2 = (IVariable) col.getName(3).resolveBinding();
assertNotSame(i1, i2);
assertInstances(col, i1, 2);
assertInstances(col, i2, 4);
}
// class X { int i, j; };
// class Y { X x; };
// void foo() {
// const Y y;
// y.x.i++;
// y.x.j++;
// Y* p = const_cast<Y*>(&y);
// p->x.i;
// p->x.j;
// }
public void testBug86350() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField i = (ICPPField) col.getName(1).resolveBinding();
ICPPField j = (ICPPField) col.getName(2).resolveBinding();
ICPPField x = (ICPPField) col.getName(5).resolveBinding();
assertInstances(col, i, 3);
assertInstances(col, j, 3);
assertInstances(col, x, 5);
}
// void foo() {
// struct A {
// int val;
// A(int i) : val(i) { }
// ~A() { }
// operator bool() { return val != 0; }
// };
// int i = 1;
// while (A a = i) {
// i = 0;
// }
// }
public void testBug84478() throws Exception {
IASTFunctionDefinition foo = (IASTFunctionDefinition) parse(
getAboveComment(), ParserLanguage.CPP).getDeclarations()[0];
ICPPASTWhileStatement whileStatement = (ICPPASTWhileStatement) ((IASTCompoundStatement) foo
.getBody()).getStatements()[2];
assertNull(whileStatement.getCondition());
assertNotNull(whileStatement.getConditionDeclaration());
}
// void foo() {
// const int x = 12;
// { enum { x = x }; }
// }
// enum { RED };
public void testBug86353() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IEnumerator enum_x = (IEnumerator) col.getName(3).resolveBinding();
IBinding x_ref = col.getName(4).resolveBinding();
IEnumerator RED = (IEnumerator) col.getName(6).resolveBinding();
String[] s = ((ICPPBinding) RED).getQualifiedName();
assertEquals(s[0], "RED"); //$NON-NLS-1$
assertTrue(((ICPPBinding) RED).isGloballyQualified());
IASTName[] decls = tu.getDeclarationsInAST(enum_x);
assertEquals(decls.length, 1);
assertSame(decls[0], col.getName(3));
decls = tu.getDeclarationsInAST(x_ref);
assertEquals(decls.length, 1);
assertSame(decls[0], col.getName(1));
decls = tu.getDeclarationsInAST(RED);
assertEquals(decls.length, 1);
assertSame(decls[0], col.getName(6));
}
// class D {};
// D d1;
// const D d2;
// void foo() {
// typeid(d1) == typeid(d2);
// typeid( D ) == typeid(d2);
// }
public void testBug86274() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 10);
IVariable d1 = (IVariable) col.getName(6).resolveBinding();
IVariable d2 = (IVariable) col.getName(7).resolveBinding();
ICPPClassType D = (ICPPClassType) col.getName(8).resolveBinding();
assertInstances(col, D, 4);
assertInstances(col, d1, 2);
assertInstances(col, d2, 3);
}
// void point ( int = 3, int = 4 );
// void foo() {
// point( 1, 2 );
// point( 1 );
// point( );
// }
public void testBug86546() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction point = (IFunction) col.getName(0).resolveBinding();
assertInstances(col, point, 4);
}
// namespace Outer{
// int i;
// namespace Inner {
// void f() { i++; }
// int i;
// void g() { i++; }
// }
// }
public void testBug86358_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable i = (IVariable) col.getName(4).resolveBinding();
IVariable i2 = (IVariable) col.getName(7).resolveBinding();
assertInstances(col, i, 2);
assertInstances(col, i2, 2);
}
// namespace Q {
// namespace V {
// void f();
// }
// void V::f() {}
// namespace V {
// }
// }
public void testBug86358_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(2).resolveBinding();
ICPPFunction f2 = (ICPPFunction) col.getName(5).resolveBinding();
assertSame(f1, f2);
IASTName[] decls = tu.getDeclarationsInAST(f2);
assertEquals(decls.length, 2);
assertSame(decls[0], col.getName(2));
assertSame(decls[1], col.getName(5));
String[] s = f2.getQualifiedName();
assertEquals(s[0], "Q"); //$NON-NLS-1$
assertEquals(s[1], "V"); //$NON-NLS-1$
assertEquals(s[2], "f"); //$NON-NLS-1$
assertTrue(f2.isGloballyQualified());
}
// struct B {
// void f ( char );
// void g ( char );
// };
// struct D : B {
// using B::f;
// void f( int ) { f('c'); }
// void g( int ) { g('c'); }
// };
public void test86371() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction f_ref = (ICPPFunction) col.getName(12).resolveBinding();
ICPPFunction g_ref = (ICPPFunction) col.getName(15).resolveBinding();
ICPPFunction f = (ICPPFunction) col.getName(1).resolveBinding();
assertSame(f_ref, f);
IFunction g = (IFunction) col.getName(13).resolveBinding();
assertSame(g, g_ref);
assertInstances(col, f_ref, 2);
assertInstances(col, g_ref, 2);
String[] s = f_ref.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertEquals(s[1], "f"); //$NON-NLS-1$
assertTrue(f_ref.isGloballyQualified());
s = g_ref.getQualifiedName();
assertEquals(s[0], "D"); //$NON-NLS-1$
assertEquals(s[1], "g"); //$NON-NLS-1$
assertTrue(f.isGloballyQualified());
}
// namespace Company_with_veryblahblah {}
// namespace CWVLN = Company_with_veryblahblah;
// namespace CWVLN = Company_with_veryblahblah;
// namespace CWVLN = CWVLN;
public void testBug86369() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace ns = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPNamespace alias = (ICPPNamespace) col.getName(1).resolveBinding();
String[] s = ns.getQualifiedName();
assertEquals(s[0], "Company_with_veryblahblah"); //$NON-NLS-1$
s = alias.getQualifiedName();
assertEquals(s[0], "CWVLN"); //$NON-NLS-1$
assertTrue(alias instanceof ICPPNamespaceAlias);
assertSame(((ICPPNamespaceAlias) alias).getBinding(), ns);
IASTName[] refs = tu.getReferences(ns);
assertEquals(refs.length, 2);
assertSame(refs[0], col.getName(2));
assertSame(refs[1], col.getName(4));
IASTName[] decls = tu.getDeclarationsInAST(ns);
assertEquals(decls.length, 1);
assertSame(decls[0], col.getName(0));
refs = tu.getReferences(alias);
assertEquals(refs.length, 1);
assertSame(refs[0], col.getName(6));
decls = tu.getDeclarationsInAST(alias);
assertEquals(decls.length, 3);
assertSame(decls[0], col.getName(1));
assertSame(decls[1], col.getName(3));
assertSame(decls[2], col.getName(5));
}
// namespace A {
// void f( char );
// void f( int );
// }
// using A::f;
public void testBug86470_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPUsingDeclaration u = (ICPPUsingDeclaration) col.getName(7)
.resolveBinding();
IASTName[] decls = tu.getDeclarationsInAST(u);
assertEquals(3, decls.length); // 2 function-decls + using-decl
assertSame(decls[0], col.getName(1));
assertSame(decls[1], col.getName(3));
IBinding[] delegates = u.getDelegates();
assertEquals(delegates.length, 2);
decls = tu.getDeclarationsInAST(delegates[0]);
assertEquals(2, decls.length); // function-decl + using-decl
assertSame(decls[0], col.getName(1));
assertSame(decls[1], col.getName(7));
decls = tu.getDeclarationsInAST(delegates[0]);
assertEquals(2, decls.length); // function-decl + using-decl
assertSame(decls[0], col.getName(1));
}
// namespace A {
// void f( int );
// void f( double );
// }
// namespace B {
// void f( int );
// void f( double );
// void f( char );
// }
// void g() {
// using A::f;
// using B::f;
// f( 'c' );
// }
public void testBug86470_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f_decl = (IFunction) col.getName(10).resolveBinding();
IFunction f_ref = (IFunction) col.getName(19).resolveBinding();
assertSame(f_decl, f_ref);
}
// namespace A {
// struct g {};
// void g ( char );
// }
// void f() {
// using A::g;
// g('a');
// struct g gg;
// }
public void testBug86470_3() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IBinding ref1 = col.getName(8).resolveBinding();
IBinding ref2 = col.getName(9).resolveBinding();
ICPPClassType g_struct = (ICPPClassType) col.getName(1)
.resolveBinding();
IFunction g_func = (IFunction) col.getName(2).resolveBinding();
assertSame(g_struct,ref2);
assertSame(g_func, ref1);
ICPPUsingDeclaration comp = (ICPPUsingDeclaration) col.getName(7)
.resolveBinding();
IASTName[] decls = tu.getDeclarationsInAST(comp);
assertEquals(3, decls.length); // struct, func and using-decl
assertSame(decls[0], col.getName(1));
assertSame(decls[1], col.getName(2));
assertSame(decls[2], col.getName(7));
}
// namespace A {
// int x;
// }
// namespace B {
// struct x {};
// }
// void f() {
// using A::x;
// using B::x;
// x = 1;
// struct x xx;
// }
public void testBug86470_4() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPBinding ref1 = (ICPPBinding) col.getName(11).resolveBinding();
ICPPBinding ref2 = (ICPPBinding) col.getName(12).resolveBinding();
ICPPClassType x_struct = (ICPPClassType) col.getName(3)
.resolveBinding();
IVariable x_var = (IVariable) col.getName(1).resolveBinding();
assertSame(x_struct, ref2);
assertSame(x_var, ref1);
IASTName[] refs = tu.getReferences(x_struct);
assertEquals(2, refs.length); // 1 ref + using-decl
assertSame(refs[0], col.getName(10));
assertSame(refs[1], col.getName(12));
String[] s = ref2.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertEquals(s[1], "x"); //$NON-NLS-1$
assertTrue(ref2.isGloballyQualified());
s = x_struct.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertEquals(s[1], "x"); //$NON-NLS-1$
assertTrue(x_struct.isGloballyQualified());
}
// namespace A {
// void f( int );
// void f( double );
// }
// void g() {
// void f( char );
// using A::f;
// f( 3.5 );
// }
public void testBug86470_5() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction f = (ICPPFunction) col.getName(3).resolveBinding();
ICPPFunction f_ref = (ICPPFunction) col.getName(11).resolveBinding();
assertSame( f_ref, f);
String[] s = f_ref.getQualifiedName();
assertEquals(s[0], "A"); //$NON-NLS-1$
assertEquals(s[1], "f"); //$NON-NLS-1$
assertTrue(f_ref.isGloballyQualified());
s = f.getQualifiedName();
assertEquals(s[0], "A"); //$NON-NLS-1$
assertEquals(s[1], "f"); //$NON-NLS-1$
assertTrue(f.isGloballyQualified());
}
// class B;
// class A {
// int i;
// friend void f( B * );
// };
// class B : public A {};
// void f( B* p ) {
// p->i = 1;
// }
public void testBug86678() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType B = (ICPPClassType) col.getName(6).resolveBinding();
ICPPField i = (ICPPField) col.getName(12).resolveBinding();
IParameter p = (IParameter) col.getName(10).resolveBinding();
assertInstances(col, B, 4);
assertInstances(col, i, 2);
assertInstances(col, p, 3);
}
// int printf( const char *, ... );
// void foo(){
// int a, b;
// printf( "hello" );
// printf("a=%d b=%d", a, b );
// }
public void testBug86543() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction printf = (IFunction) col.getName(6).resolveBinding();
assertInstances(col, printf, 3);
}
// int max( int a, int b, int c ) {
// int m = ( a > b ) ? a : b;
// return ( m > c ) ? m : c;
// }
public void testBug86554() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable m = (IVariable) col.getName(11).resolveBinding();
IParameter a = (IParameter) col.getName(1).resolveBinding();
IParameter b = (IParameter) col.getName(2).resolveBinding();
IParameter c = (IParameter) col.getName(3).resolveBinding();
String[] s = ((ICPPBinding) a).getQualifiedName();
assertEquals(s[0], "a"); //$NON-NLS-1$
assertFalse(((ICPPBinding) a).isGloballyQualified());
assertInstances(col, m, 3);
assertInstances(col, a, 3);
assertInstances(col, b, 3);
assertInstances(col, c, 3);
}
// int g();
// struct X { static int g(); };
// struct Y : X { static int i ; };
// int Y::i = g();
public void testBug86621() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction g1 = (ICPPFunction) col.getName(0).resolveBinding();
ICPPMethod g2 = (ICPPMethod) col.getName(9).resolveBinding();
String[] s = g1.getQualifiedName();
assertEquals(s[0], "g"); //$NON-NLS-1$
assertTrue(g1.isGloballyQualified());
s = g2.getQualifiedName();
assertEquals(s[0], "X"); //$NON-NLS-1$
assertEquals(s[1], "g"); //$NON-NLS-1$
assertTrue(g2.isGloballyQualified());
assertInstances(col, g1, 1);
assertInstances(col, g2, 2);
}
// class V { int f(); int x; };
// class W { int g(); int y; };
// class B : public virtual V, public W {
// int f(); int x;
// int g(); int y;
// };
// class C : public virtual V, public W {};
// class D : public B, public C {
// void foo();
// };
// void D::foo(){
// x++;
// f();
// y++;
// g();
// }
public void testBug86649() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField x = (ICPPField) col.getName(23).resolveBinding();
ICPPMethod f = (ICPPMethod) col.getName(24).resolveBinding();
String[] s = f.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertEquals(s[1], "f"); //$NON-NLS-1$
assertTrue(f.isGloballyQualified());
s = x.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertEquals(s[1], "x"); //$NON-NLS-1$
assertTrue(x.isGloballyQualified());
IProblemBinding y = (IProblemBinding) col.getName(25).resolveBinding();
IProblemBinding g = (IProblemBinding) col.getName(26).resolveBinding();
assertEquals(y.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP);
assertEquals(g.getID(), IProblemBinding.SEMANTIC_AMBIGUOUS_LOOKUP);
assertInstances(col, x, 2);
assertInstances(col, f, 2);
}
// struct C {
// int c;
// C() : c(0) { }
// };
public void testBug86827() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPVariable c = (ICPPVariable) col.getName(1).resolveBinding();
String[] s = c.getQualifiedName();
assertEquals(s.length, 2);
assertEquals(s[0], "C"); //$NON-NLS-1$
assertEquals(s[1], "c"); //$NON-NLS-1$
assertTrue(c.isGloballyQualified());
IASTName[] refs = tu.getReferences(c);
assertEquals(refs.length, 1);
assertSame(refs[0], col.getName(3));
}
// void f( int par ) {
// int v1;
// {
// int v2;
// }
// }
public void testFind_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPVariable v1 = (ICPPVariable) col.getName(2).resolveBinding();
ICPPVariable v2 = (ICPPVariable) col.getName(3).resolveBinding();
String[] s = v1.getQualifiedName();
assertEquals(s[0], "v1"); //$NON-NLS-1$
assertFalse(v1.isGloballyQualified());
s = v2.getQualifiedName();
assertEquals(s[0], "v2"); //$NON-NLS-1$
assertFalse(v2.isGloballyQualified());
ICPPBlockScope scope = (ICPPBlockScope) v2.getScope();
IBinding[] bs = scope.find("v1"); //$NON-NLS-1$
assertEquals(bs.length, 1);
assertSame(bs[0], v1);
}
// class A { int a; };
// class B : public A {
// void f();
// };
// void B::f() {
// }
public void testFind_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPField a = (ICPPField) col.getName(1).resolveBinding();
ICPPMethod f = (ICPPMethod) col.getName(7).resolveBinding();
IScope scope = f.getFunctionScope();
IBinding[] bs = scope.find("a"); //$NON-NLS-1$
assertEquals(bs.length, 1);
assertSame(bs[0], a);
bs = scope.find("~B"); //$NON-NLS-1$
assertEquals(bs.length, 1);
assertTrue(bs[0] instanceof ICPPMethod);
assertTrue(bs[0].getName().equals("~B")); //$NON-NLS-1$
bs = scope.find("A"); //$NON-NLS-1$
assertEquals(bs.length, 1);
assertSame(bs[0], A);
}
// namespace A {
// void f( int );
// void f( double );
// }
// void g() {
// void f( char );
// using A::f;
// }
public void testFind_3() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(1).resolveBinding();
IFunction f2 = (IFunction) col.getName(3).resolveBinding();
IFunction f3 = (IFunction) col.getName(6).resolveBinding();
IASTFunctionDefinition def = (IASTFunctionDefinition) col.getName(5).getParent().getParent();
IScope scope = ((IASTCompoundStatement) def.getBody()).getScope();
IBinding[] bs = scope.find("f"); //$NON-NLS-1$
assertEquals(3, bs.length);
assertSame(bs[0], f3);
assertSame(bs[1], f1);
assertSame(bs[2], f2);
String[] s = ((ICPPBinding) bs[1]).getQualifiedName();
assertEquals(s.length, 2);
assertEquals(s[0], "A"); //$NON-NLS-1$
assertEquals(s[1], "f"); //$NON-NLS-1$
assertTrue(((ICPPBinding) bs[1]).isGloballyQualified());
}
// namespace A {
// struct f;
// void f();
// }
// namespace B {
// void f( int );
// }
// namespace C {
// using namespace B;
// }
// void g(){
// using namespace A;
// using namespace C;
// }
public void testFind_4() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType f = (ICPPClassType) col.getName(1).resolveBinding();
IFunction f1 = (IFunction) col.getName(2).resolveBinding();
IFunction f2 = (IFunction) col.getName(4).resolveBinding();
IASTFunctionDefinition def = (IASTFunctionDefinition) col.getName(8)
.getParent().getParent();
IScope scope = ((IASTCompoundStatement) def.getBody()).getScope();
IBinding[] bs = scope.find("f"); //$NON-NLS-1$
assertEquals(3, bs.length);
assertSame(bs[0], f);
assertSame(bs[1], f1);
assertSame(bs[2], f2);
}
// class A {
// public:
// A();
// void f();
// };
// class B : public A {
// public:
// B();
// void bf();
// };
public void testFind_bug185408() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(6).resolveBinding();
IScope classScope= f1.getScope();
assertTrue(classScope instanceof ICPPClassScope);
IBinding[] bindings = classScope.find("bf");
ICPPMethod method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "B");
bindings= classScope.find("f");
method= extractSingleMethod(bindings);
assertEquals(method.getQualifiedName()[0], "A");
bindings= classScope.find("B");
ICPPClassType classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "B");
bindings= classScope.find("A");
classType= extractSingleClass(bindings);
assertEquals(classType.getQualifiedName()[0], "A");
}
private ICPPMethod extractSingleMethod(IBinding[] bindings) {
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ICPPMethod);
return (ICPPMethod) bindings[0];
}
private ICPPClassType extractSingleClass(IBinding[] bindings) {
assertEquals(1, bindings.length);
assertTrue(bindings[0] instanceof ICPPClassType);
return (ICPPClassType) bindings[0];
}
// class A {
// int a;
// void fa();
// };
// class B : public A {
// int b;
// void fb();
// };
public void testGets() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(3).resolveBinding();
ICPPField a = (ICPPField) col.getName(1).resolveBinding();
ICPPMethod fa = (ICPPMethod) col.getName(2).resolveBinding();
ICPPField b = (ICPPField) col.getName(5).resolveBinding();
ICPPMethod fb = (ICPPMethod) col.getName(6).resolveBinding();
Object[] result = B.getDeclaredFields();
assertEquals(result.length, 1);
assertSame(result[0], b);
result = B.getFields();
assertEquals(result.length, 2);
assertSame(result[0], b);
assertSame(result[1], a);
result = B.getDeclaredMethods();
assertEquals(result.length, 1);
assertSame(result[0], fb);
result = B.getAllDeclaredMethods();
assertEquals(result.length, 2);
assertSame(result[0], fb);
assertSame(result[1], fa);
ICPPMethod[] B_implicit = ((ICPPClassScope) B.getCompositeScope())
.getImplicitMethods();
assertEquals(B_implicit.length, 4);
assertTrue(B_implicit[0].getName().equals("B")); //$NON-NLS-1$
assertTrue(B_implicit[1].getName().equals("B")); //$NON-NLS-1$
assertTrue(B_implicit[2].getName().equals("operator =")); //$NON-NLS-1$
assertTrue(B_implicit[3].getName().equals("~B")); //$NON-NLS-1$
ICPPMethod[] A_implicit = ((ICPPClassScope) A.getCompositeScope())
.getImplicitMethods();
assertEquals(A_implicit.length, 4);
assertTrue(A_implicit[0].getName().equals("A")); //$NON-NLS-1$
assertTrue(A_implicit[1].getName().equals("A")); //$NON-NLS-1$
assertTrue(A_implicit[2].getName().equals("operator =")); //$NON-NLS-1$
assertTrue(A_implicit[3].getName().equals("~A")); //$NON-NLS-1$
result = B.getMethods();
assertEquals(result.length, 10);
assertSame(result[0], fb);
assertSame(result[1], B_implicit[0]);
assertSame(result[2], B_implicit[1]);
assertSame(result[3], B_implicit[2]);
assertSame(result[4], B_implicit[3]);
assertSame(result[5], fa);
assertSame(result[6], A_implicit[0]);
assertSame(result[7], A_implicit[1]);
assertSame(result[8], A_implicit[2]);
assertSame(result[9], A_implicit[3]);
}
public void testBug87424() throws Exception {
IASTTranslationUnit tu = parse(
"int * __restrict x;", ParserLanguage.CPP, true); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable x = (IVariable) col.getName(0).resolveBinding();
IType t = x.getType();
assertTrue(t instanceof IGPPPointerType);
assertTrue(((IGPPPointerType) t).isRestrict());
tu = parse("class A {}; int A::* __restrict x;", ParserLanguage.CPP, true); //$NON-NLS-1$
col = new CPPNameCollector();
tu.accept(col);
x = (IVariable) col.getName(3).resolveBinding();
t = x.getType();
assertTrue(t instanceof IGPPPointerToMemberType);
assertTrue(((IGPPPointerToMemberType) t).isRestrict());
}
public void testBug87705() throws Exception {
IASTTranslationUnit tu = parse(
"class A { friend class B::C; };", ParserLanguage.CPP, true); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IProblemBinding B = (IProblemBinding) col.getName(2).resolveBinding();
assertEquals(B.getID(), IProblemBinding.SEMANTIC_NAME_NOT_FOUND);
IProblemBinding C = (IProblemBinding) col.getName(3).resolveBinding();
assertEquals(C.getID(), IProblemBinding.SEMANTIC_BAD_SCOPE);
}
public void testBug88459() throws Exception {
IASTTranslationUnit tu = parse("int f(); ", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(0).resolveBinding();
assertFalse(f.isStatic());
}
public void testBug88501_1() throws Exception {
IASTTranslationUnit tu = parse(
"void f(); void f( int ); struct f;", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).resolveBinding() instanceof IFunction);
assertTrue(col.getName(1).resolveBinding() instanceof IFunction);
assertTrue(col.getName(3).resolveBinding() instanceof ICPPClassType);
}
// public void testBug8342_1() throws Exception {
// IASTTranslationUnit tu = parse( "int a; int a;", ParserLanguage.CPP );
// //$NON-NLS-1$
// CPPNameCollector col = new CPPNameCollector();
// tu.accept(col);
//
// assertTrue( col.getName(0).resolveBinding() instanceof IVariable );
// IProblemBinding p = (IProblemBinding) col.getName(1).resolveBinding();
// assertEquals( p.getID(), IProblemBinding.SEMANTIC_INVALID_REDEFINITION );
// }
public void testBug8342_2() throws Exception {
IASTTranslationUnit tu = parse(
"extern int a; extern char a;", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).resolveBinding() instanceof IVariable);
IProblemBinding p = (IProblemBinding) col.getName(1).resolveBinding();
assertEquals(p.getID(), IProblemBinding.SEMANTIC_INVALID_REDECLARATION);
}
// namespace A { int i; }
// namespace B = A;
// void f() {
// B::i;
// }
public void testNamespaceAlias_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace A = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPNamespaceAlias alias = (ICPPNamespaceAlias) col.getName(6)
.resolveBinding();
ICPPVariable i = (ICPPVariable) col.getName(7).resolveBinding();
assertInstances(col, A, 2);
assertInstances(col, alias, 2);
assertInstances(col, i, 3);
String[] s = i.getQualifiedName();
assertEquals(s[0], "A"); //$NON-NLS-1$
assertEquals(s[1], "i"); //$NON-NLS-1$
assertTrue(i.isGloballyQualified());
s = alias.getQualifiedName();
assertEquals(s[0], "B"); //$NON-NLS-1$
assertTrue(alias.isGloballyQualified());
}
// class A{};
// class B : public A {
// B () : A() {}
// };
public void testBug89539() throws Exception {
String content= getAboveComment();
IASTTranslationUnit tu = parse(content, ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A1 = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType A2 = (ICPPClassType) col.getName(2).resolveBinding();
assertSame(A1, A2);
ICPPConstructor A3 = (ICPPConstructor) col.getName(4).resolveBinding();
assertSame(A3.getScope(), A1.getCompositeScope());
tu = parse(content, ParserLanguage.CPP);
col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(4).resolveBinding() instanceof ICPPConstructor);
}
// class B * b;
// class A {
// A * a;
// };
// class A;
public void testBug89851() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).resolveBinding() instanceof ICPPClassType);
assertTrue(col.getName(1).resolveBinding() instanceof ICPPVariable);
assertTrue(col.getName(2).resolveBinding() instanceof ICPPClassType);
assertTrue(col.getName(3).resolveBinding() instanceof ICPPClassType);
}
public void testBug89828() throws Exception {
IASTTranslationUnit tu = parse(
"class B * b; void f(); void f( int );", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).resolveBinding() instanceof ICPPClassType);
assertTrue(col.getName(1).resolveBinding() instanceof ICPPVariable);
IFunction f1 = (IFunction) col.getName(2).resolveBinding();
IFunction f2 = (IFunction) col.getName(3).resolveBinding();
IScope scope = tu.getScope();
IBinding[] bs = scope.find("f"); //$NON-NLS-1$
assertEquals(bs.length, 2);
assertSame(bs[0], f1);
assertSame(bs[1], f2);
}
// class A {
// enum type { t1, t2 };
// void f( type t );
// };
// class B : public A {
// void g() {
// f( A::t1 );
// }
// };
public void testBug90039() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(10).resolveBinding();
IEnumerator t1 = (IEnumerator) col.getName(13).resolveBinding();
assertInstances(col, f, 2);
assertInstances(col, t1, 3);
}
// void f( void ) {
// enum { one };
// }
public void testBug90039_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).resolveBinding() instanceof IFunction);
assertTrue(col.getName(1).resolveBinding() instanceof IParameter);
IEnumeration e = (IEnumeration) col.getName(2).resolveBinding();
IEnumerator one = (IEnumerator) col.getName(3).resolveBinding();
assertSame(one.getType(), e);
}
// class Foo {
// public:
// operator int();
// char& operator[](unsigned int);
// };
public void testOperatorConversionNames() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IASTName name1 = col.getName(1);
IASTName name2 = col.getName(2);
assertNotNull(name1);
assertNotNull(name2);
assertTrue(name1 instanceof ICPPASTConversionName);
assertTrue(name2 instanceof ICPPASTOperatorName);
IASTTypeId typeId = ((ICPPASTConversionName) name1).getTypeId();
assertNotNull(typeId);
assertEquals(((IASTSimpleDeclSpecifier) typeId.getDeclSpecifier())
.getType(), IASTSimpleDeclSpecifier.t_int);
}
// class X { operator int(); };
// X::operator int() { }
// template <class A,B> class X<A,C> { operator int(); };
// template <class A,B> X<A,C>::operator int() { }
public void testBug36769B() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
// 1,4,12,21 - conversion
// 2, 16 .isConversion
final IASTName int1 = col.getName(1);
assertNotNull(int1);
assertTrue(int1 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int1).getTypeId());
IASTFunctionDefinition fdef= getDeclaration(tu, 1);
final IASTName x_int = fdef.getDeclarator().getName();
assertNotNull(x_int);
assertTrue(x_int instanceof ICPPASTQualifiedName);
assertTrue(((ICPPASTQualifiedName) x_int).isConversionOrOperator());
final IASTName int2= ((ICPPASTQualifiedName)x_int).getLastName();
assertNotNull(int2);
assertTrue(int2 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int2).getTypeId());
final IASTName int3 = col.getName(12);
assertNotNull(int3);
assertTrue(int3 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int3).getTypeId());
ICPPASTTemplateDeclaration tdef= getDeclaration(tu, 3);
fdef= (IASTFunctionDefinition) tdef.getDeclaration();
final IASTName x_ac_int = fdef.getDeclarator().getName();
assertNotNull(x_ac_int);
assertTrue(x_ac_int instanceof ICPPASTQualifiedName);
assertTrue(((ICPPASTQualifiedName) x_ac_int).isConversionOrOperator());
final IASTName int4= ((ICPPASTQualifiedName)x_ac_int).getLastName();
assertNotNull(int4);
assertTrue(int4 instanceof ICPPASTConversionName);
assertNotNull(((ICPPASTConversionName) int4).getTypeId());
}
public void testBug88662() throws Exception {
IASTTranslationUnit tu = parse(
"int foo() { return int();}", ParserLanguage.CPP); //$NON-NLS-1$
IASTReturnStatement returnStatement = (IASTReturnStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
.getDeclarations()[0]).getBody()).getStatements()[0];
ICPPASTSimpleTypeConstructorExpression expression = (ICPPASTSimpleTypeConstructorExpression) returnStatement
.getReturnValue();
assertEquals(expression.getInitialValue(), null);
assertEquals(expression.getSimpleType(),
ICPPASTSimpleTypeConstructorExpression.t_int);
}
public void testBug90498_1() throws Exception {
IASTTranslationUnit tu = parse(
"typedef int INT;\ntypedef INT ( FOO ) (INT);", ParserLanguage.CPP); //$NON-NLS-1$
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[1];
IASTDeclSpecifier declSpec = decl.getDeclSpecifier();
assertTrue(declSpec instanceof ICPPASTNamedTypeSpecifier);
assertEquals(((ICPPASTNamedTypeSpecifier) declSpec).getName()
.toString(), "INT"); //$NON-NLS-1$
IASTDeclarator dtor = decl.getDeclarators()[0];
assertTrue(dtor instanceof IASTFunctionDeclarator);
assertNotNull(dtor.getNestedDeclarator());
IASTDeclarator nested = dtor.getNestedDeclarator();
assertEquals(nested.getName().toString(), "FOO"); //$NON-NLS-1$
}
public void testBug90498_2() throws Exception {
IASTTranslationUnit tu = parse(
"int (* foo) (int) (0);", ParserLanguage.CPP); //$NON-NLS-1$
IASTSimpleDeclaration decl = (IASTSimpleDeclaration) tu
.getDeclarations()[0];
IASTDeclSpecifier declSpec = decl.getDeclSpecifier();
assertTrue(declSpec instanceof IASTSimpleDeclSpecifier);
IASTDeclarator dtor = decl.getDeclarators()[0];
assertTrue(dtor instanceof IASTFunctionDeclarator);
assertNotNull(dtor.getNestedDeclarator());
IASTDeclarator nested = dtor.getNestedDeclarator();
assertEquals(nested.getName().toString(), "foo"); //$NON-NLS-1$
assertNotNull(dtor.getInitializer());
}
// class D { /* ... */ };
// D d1;
// const D d2;
// void foo() {
// typeid(d1) == typeid(d2);
// typeid(D) == typeid(d2);
// }
public void testBug866274() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTFunctionDefinition foo = (IASTFunctionDefinition) tu
.getDeclarations()[3];
IASTCompoundStatement cs = (IASTCompoundStatement) foo.getBody();
IASTStatement[] subs = cs.getStatements();
for (int i = 0; i < subs.length; ++i) {
IASTBinaryExpression be = (IASTBinaryExpression) ((IASTExpressionStatement) subs[i])
.getExpression();
if (i == 1) {
IASTTypeIdExpression expression = (IASTTypeIdExpression) be
.getOperand1();
IASTTypeId typeId = expression.getTypeId();
assertTrue(((IASTNamedTypeSpecifier) typeId.getDeclSpecifier())
.getName().resolveBinding() instanceof IType);
} else {
IASTUnaryExpression expression = (IASTUnaryExpression) be
.getOperand1();
IASTIdExpression idExpression = (IASTIdExpression) expression
.getOperand();
assertTrue(idExpression.getName().resolveBinding() instanceof IVariable);
}
IASTUnaryExpression expression = (IASTUnaryExpression) be
.getOperand2();
IASTIdExpression idExpression = (IASTIdExpression) expression
.getOperand();
assertTrue(idExpression.getName().resolveBinding() instanceof IVariable);
}
}
public void testTypedefFunction() throws Exception {
IASTTranslationUnit tu = parse(
"typedef int foo (int);", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IBinding binding = col.getName(0).resolveBinding();
assertTrue(binding instanceof ITypedef);
assertTrue(((ITypedef) binding).getType() instanceof IFunctionType);
}
// void f( int );
// void foo(){
// f( ( 1, 2 ) );
// }
public void testBug90616() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
IFunction f2 = (IFunction) col.getName(3).resolveBinding();
assertSame(f1, f2);
}
public void testBug90603() throws Exception {
IASTTranslationUnit tu = parse(
"class X { void f(){} };", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType X = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod f1 = (ICPPMethod) col.getName(1).resolveBinding();
assertFalse(f1.isStatic());
String[] qns = f1.getQualifiedName();
assertEquals(qns.length, 2);
assertEquals(qns[0], "X"); //$NON-NLS-1$
assertEquals(qns[1], "f"); //$NON-NLS-1$
assertTrue(f1.isGloballyQualified());
assertEquals(f1.getVisibility(), ICPPMember.v_private);
assertSame(f1.getScope(), X.getCompositeScope());
}
// class X { };
// X x;
// class X { };
public void testBug90662() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType X = (ICPPClassType) col.getName(0).resolveBinding();
IVariable x = (IVariable) col.getName(2).resolveBinding();
IProblemBinding problem = (IProblemBinding) col.getName(3)
.resolveBinding();
assertSame(x.getType(), X);
assertEquals(problem.getID(),
IProblemBinding.SEMANTIC_INVALID_REDEFINITION);
}
// struct C {
// void* operator new [ ] (unsigned int);
// void* operator new (unsigned int);
// void operator delete [ ] ( void * );
// void operator delete (void *);
// const C& operator+=(const C&);
// const C& operator -= (const C&);
// const C& operator *= (const C&);
// const C& operator /= (const C&);
// const C& operator %= (const C&);
// const C& operator^=(const C&);
// const C& operator&= (const C&);
// const C& operator |= (const C&);
// const C& operator >>=(const C&);
// const C& operator<<= (const C&);
// const C& operator<<(const C&);
// const C& operator>>(const C&);
// const C& operator /**/ == /**/ (const C&);
// const C& operator != /**/ (const C&);
// const C& operator <= (const C&);
// const C& operator /**/ >=(const C&);
// const C& operator =(const C&);
// const C& operator&& (const C&);
// const C& operator ||(const C&);
// const C& operator ++(const C&);
// const C& operator-- (const C&);
// const C& operator/**/,/**/(const C&);
// const C& operator->*
// (const C&);
// const C& operator -> (const C&);
// const C& operator /**/ ( /**/ ) /**/ (const C&);
// const C& operator /**/ [ /**/ ] /**/ (const C&);
// const C& operator + (const C&);
// const C& operator- (const C&);
// const C& operator *(const C&);
// const C& operator /(const C&);
// const C& operator % /**/(const C&);
// const C& operator ^(const C&);
// const C& operator &(const C&);
// const C& operator |(const C&);
// const C& operator ~ (const C&);
// const C& operator
// ! /**/ (const C&);
// const C& operator <(const C&);
// const C& operator>(const C&);
// };
public void testOperatorNames() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 161);
assertEquals(col.getName(1).toString(), "operator new[]"); //$NON-NLS-1$
assertEquals(col.getName(3).toString(), "operator new"); //$NON-NLS-1$
assertEquals(col.getName(5).toString(), "operator delete[]"); //$NON-NLS-1$
assertEquals(col.getName(7).toString(), "operator delete"); //$NON-NLS-1$
assertEquals(col.getName(10).toString(), "operator +="); //$NON-NLS-1$
assertEquals(col.getName(14).toString(), "operator -="); //$NON-NLS-1$
assertEquals(col.getName(18).toString(), "operator *="); //$NON-NLS-1$
assertEquals(col.getName(22).toString(), "operator /="); //$NON-NLS-1$
assertEquals(col.getName(26).toString(), "operator %="); //$NON-NLS-1$
assertEquals(col.getName(30).toString(), "operator ^="); //$NON-NLS-1$
assertEquals(col.getName(34).toString(), "operator &="); //$NON-NLS-1$
assertEquals(col.getName(38).toString(), "operator |="); //$NON-NLS-1$
assertEquals(col.getName(42).toString(), "operator >>="); //$NON-NLS-1$
assertEquals(col.getName(46).toString(), "operator <<="); //$NON-NLS-1$
assertEquals(col.getName(50).toString(), "operator <<"); //$NON-NLS-1$
assertEquals(col.getName(54).toString(), "operator >>"); //$NON-NLS-1$
assertEquals(col.getName(58).toString(), "operator =="); //$NON-NLS-1$
assertEquals(col.getName(62).toString(), "operator !="); //$NON-NLS-1$
assertEquals(col.getName(66).toString(), "operator <="); //$NON-NLS-1$
assertEquals(col.getName(70).toString(), "operator >="); //$NON-NLS-1$
assertEquals(col.getName(74).toString(), "operator ="); //$NON-NLS-1$
assertEquals(col.getName(78).toString(), "operator &&"); //$NON-NLS-1$
assertEquals(col.getName(82).toString(), "operator ||"); //$NON-NLS-1$
assertEquals(col.getName(86).toString(), "operator ++"); //$NON-NLS-1$
assertEquals(col.getName(90).toString(), "operator --"); //$NON-NLS-1$
assertEquals(col.getName(94).toString(), "operator ,"); //$NON-NLS-1$
assertEquals(col.getName(98).toString(), "operator ->*"); //$NON-NLS-1$
assertEquals(col.getName(102).toString(), "operator ->"); //$NON-NLS-1$
assertEquals(col.getName(106).toString(), "operator ()"); //$NON-NLS-1$
assertEquals(col.getName(110).toString(), "operator []"); //$NON-NLS-1$
assertEquals(col.getName(114).toString(), "operator +"); //$NON-NLS-1$
assertEquals(col.getName(118).toString(), "operator -"); //$NON-NLS-1$
assertEquals(col.getName(122).toString(), "operator *"); //$NON-NLS-1$
assertEquals(col.getName(126).toString(), "operator /"); //$NON-NLS-1$
assertEquals(col.getName(130).toString(), "operator %"); //$NON-NLS-1$
assertEquals(col.getName(134).toString(), "operator ^"); //$NON-NLS-1$
assertEquals(col.getName(138).toString(), "operator &"); //$NON-NLS-1$
assertEquals(col.getName(142).toString(), "operator |"); //$NON-NLS-1$
assertEquals(col.getName(146).toString(), "operator ~"); //$NON-NLS-1$
assertEquals(col.getName(150).toString(), "operator !"); //$NON-NLS-1$
assertEquals(col.getName(154).toString(), "operator <"); //$NON-NLS-1$
assertEquals(col.getName(158).toString(), "operator >"); //$NON-NLS-1$
}
// typedef int I;
// typedef int I;
// typedef I I;
// class A {
// typedef char I;
// typedef char I;
// typedef I I;
// };
public void testBug90623() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ITypedef I1 = (ITypedef) col.getName(0).resolveBinding();
ITypedef I2 = (ITypedef) col.getName(1).resolveBinding();
ITypedef I3 = (ITypedef) col.getName(2).resolveBinding();
ITypedef I4 = (ITypedef) col.getName(3).resolveBinding();
ITypedef I8 = (ITypedef) col.getName(5).resolveBinding();
ITypedef I5 = (ITypedef) col.getName(8).resolveBinding();
ITypedef I6 = (ITypedef) col.getName(7).resolveBinding();
ITypedef I7 = (ITypedef) col.getName(6).resolveBinding();
// ITypedef I8 = (ITypedef) col.getName(5).resolveBinding();
assertSame(I1, I2);
assertSame(I2, I3);
assertSame(I3, I4);
assertNotSame(I4, I5);
assertSame(I5, I6);
assertSame(I6, I7);
assertSame(I7, I8);
assertTrue(I1.getType() instanceof IBasicType);
assertEquals(((IBasicType) I1.getType()).getType(), IBasicType.t_int);
assertTrue(I8.getType() instanceof IBasicType);
assertEquals(((IBasicType) I8.getType()).getType(), IBasicType.t_char);
}
// typedef int I;
// void f11( I i );
// void main(){ f a; }
public void testBug90623_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IASTName f = col.getName(5);
f.getCompletionContext().findBindings(f, true);
}
// class X {
// X( const X & );
// };
// class Y {
// operator X ();
// };
// Y y;
// X x = new X( y );
public void testBug90654_1() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPConstructor ctor1 = (ICPPConstructor) col.getName(1)
.resolveBinding();
ICPPConstructor ctor = (ICPPConstructor) col.getName(11)
.resolveBinding();
assertSame(ctor, ctor1);
}
// struct A {
// operator short();
// } a;
// int f( int );
// int f( float );
// int x = f(a);
public void testBug90654_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(3).resolveBinding();
IFunction f2 = (IFunction) col.getName(8).resolveBinding();
assertSame(f1, f2);
}
// struct A {};
// struct B : public A {
// B& operator = (const B & );
// };
// B& B::operator = (const B & s){
// this->A::operator=(s);
// return *this;
// }
public void testBug90653() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPMethod implicit = A.getMethods()[2];
ICPPMethod op1 = (ICPPMethod) col.getName(4).resolveBinding();
ICPPMethod op2 = (ICPPMethod) col.getName(10).resolveBinding();
ICPPMethod op = (ICPPMethod) col.getName(15).resolveBinding();
assertSame(op1, op2);
assertSame(op, implicit);
}
// void f( char * );
// void foo() {
// f( "test" );
// }
public void testBug86618() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(0).resolveBinding();
assertInstances(col, f, 2);
}
// void f( int (*pf) (char) );
// int g( char );
// void foo () {
// f( g ) ;
// }
public void testBug45129() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction f1 = (ICPPFunction) col.getName(0).resolveBinding();
ICPPFunction g1 = (ICPPFunction) col.getName(3).resolveBinding();
IBinding f2 = col.getName(6).resolveBinding();
IBinding g2 = col.getName(7).resolveBinding();
assertSame(f1, f2);
assertSame(g1, g2);
}
// class ABC {
// class DEF { };
// static int GHI;
// };
// int ABC::GHI = 77; // ray bourque
// int f() {
// int value;
// ABC::DEF * var;
// ABC::GHI * value;
// }
public void testAmbiguousStatements() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTDeclaration[] declarations = tu.getDeclarations();
assertEquals(3, declarations.length);
IASTCompoundStatement cs = (IASTCompoundStatement) ((IASTFunctionDefinition) declarations[2])
.getBody();
assertTrue(cs.getStatements()[1] instanceof IASTDeclarationStatement);
assertTrue(cs.getStatements()[2] instanceof IASTExpressionStatement);
}
// void f(){
// union { int a; char* p; };
// a = 1;
// }
public void testBug86639() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField a = (ICPPField) col.getName(2).resolveBinding();
ICPPField a2 = (ICPPField) col.getName(4).resolveBinding();
assertSame(a, a2);
}
// void f () {
// int aa1, aa2;
// a;
// }
public void testBug80940() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IVariable a1 = (IVariable) col.getName(1).resolveBinding();
IVariable a2 = (IVariable) col.getName(2).resolveBinding();
IBinding[] bs = col.getName(3).getCompletionContext().findBindings(
col.getName(3), true);
assertEquals(bs.length, 2);
assertSame(bs[0], a1);
assertSame(bs[1], a2);
}
// struct Ex {
// int d();
// int d() const;
// };
// int Ex::d() {}
// int Ex::d() const {}
// void f() {
// const Ex * e;
// e->d();
// }
public void testBug77024() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction d1 = (ICPPFunction) col.getName(1).resolveBinding();
ICPPFunction d2 = (ICPPFunction) col.getName(2).resolveBinding();
assertNotSame(d1, d2);
assertFalse(d1.getType().isConst());
assertTrue((d2.getType()).isConst());
ICPPFunction dr1 = (ICPPFunction) col.getName(5).resolveBinding();
ICPPFunction dr2 = (ICPPFunction) col.getName(8).resolveBinding();
assertSame(d1, dr1);
assertSame(d2, dr2);
IBinding r = col.getName(13).resolveBinding();
assertSame(d2, r);
}
// class Point {
// Point() : xCoord(0) {}
// int xCoord;
// };
public void testBug91773() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField x = (ICPPField) col.getName(2).resolveBinding();
ICPPField x2 = (ICPPField) col.getName(3).resolveBinding();
assertSame(x, x2);
}
public void testBug90648() throws ParserException {
IASTTranslationUnit tu = parse(
"int f() { int (&ra)[3] = a; }", ParserLanguage.CPP); //$NON-NLS-1$
IASTFunctionDefinition f = (IASTFunctionDefinition) tu
.getDeclarations()[0];
IASTCompoundStatement body = (IASTCompoundStatement) f.getBody();
final IASTDeclarationStatement statement = (IASTDeclarationStatement) body
.getStatements()[0];
IASTSimpleDeclaration d = (IASTSimpleDeclaration) statement
.getDeclaration();
IASTSimpleDeclSpecifier declSpec = (IASTSimpleDeclSpecifier) d
.getDeclSpecifier();
assertEquals(IASTSimpleDeclSpecifier.t_int, declSpec.getType());
final IASTDeclarator[] declarators = d.getDeclarators();
assertEquals(declarators.length, 1);
assertTrue(declarators[0] instanceof IASTArrayDeclarator);
}
public void testBug92980() throws Exception {
String code = "struct A { A(); A(const A&) throw(1); ~A() throw(X); };"; //$NON-NLS-1$
parse(code, ParserLanguage.CPP, true, false);
}
// class Dummy { int v(); int d; };
// void Dummy::v( int ){ d++; }
public void testBug92882() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(5).resolveBinding() instanceof IProblemBinding);
ICPPField d1 = (ICPPField) col.getName(2).resolveBinding();
ICPPField d2 = (ICPPField) col.getName(7).resolveBinding();
assertSame(d1, d2);
}
// void f( int, int );
// void f( int, int = 3);
// void f( int = 2, int );
// void g() {
// f( 3 );
// f( );
// }
public void testBug86547() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f1 = (IFunction) col.getName(0).resolveBinding();
assertInstances(col, f1, 5);
}
public void testBug90647() throws Exception {
parse(
"char msg[] = \"Syntax error on line %s\\n\";", ParserLanguage.CPP); //$NON-NLS-1$
}
// int main(int argc, char **argv)
// {
// int sum=0;
// int i;
// for (i = 0; i < 10; ++i)
// for (int j = 0; j < 3; ++j)
// sum += j;
// for (i = 0; i < 10; ++i)
// for (int j = 0; j < 3; ++j) // line X
// sum += j; // line Y
// int k;
// k = sum;
// }
public void testBug82766() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings(col);
}
// int main(int argc, char *argv[])
// {
// unsigned long l = 0;
// char *c;
// l |= ((unsigned long)(*((c)++)))<<24;
// }
public void testBug77385() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings(col);
}
public void testBug83997() throws Exception {
IASTTranslationUnit tu = parse(
"namespace { int x; }", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings(col);
}
protected void assertNoProblemBindings(CPPNameCollector col) {
Iterator i = col.nameList.iterator();
while (i.hasNext()) {
IASTName n = (IASTName) i.next();
assertFalse(n.resolveBinding() instanceof IProblemBinding);
}
}
private void assertProblemBinding(int id, IBinding b) {
assertTrue(b instanceof IProblemBinding);
assertEquals(id, ((IProblemBinding) b).getID());
}
protected void assertProblemBindings(CPPNameCollector col, int count) {
Iterator i = col.nameList.iterator();
int sum = 0;
while (i.hasNext()) {
IASTName n = (IASTName) i.next();
assertNotNull(n.resolveBinding());
if (n.getBinding() instanceof IProblemBinding)
++sum;
}
assertEquals(count, sum);
}
public void testBug85786() throws Exception {
IASTTranslationUnit tu = parse(
"void f( int ); void foo () { void * p = &f; ( (void (*) (int)) p ) ( 1 ); }", ParserLanguage.C); //$NON-NLS-1$
CPPNameCollector nameResolver = new CPPNameCollector();
tu.accept(nameResolver);
assertNoProblemBindings(nameResolver);
}
// class C {
// static const int n = 1;
// static int arr[ n ];
// };
// int C::arr[n];
public void testBug90610() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField n = (ICPPField) col.getName(1).resolveBinding();
assertTrue(n.isStatic());
assertInstances(col, n, 3);
}
// int a;
// extern int b;
// extern int c = 1;
// int f( );
// int f( int p ){}
// struct S;
// struct S { int d; };
// struct X {
// static int y;
// };
// namespace N {}
// int X::y = 1;
// int ( *g(int) )(int);
// int ( *pf)(int);
public void testDeclDefn() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).isDefinition()); // a
assertFalse(col.getName(1).isDefinition()); // b
assertTrue(col.getName(2).isDefinition()); // c
assertFalse(col.getName(3).isDefinition()); // f ()
assertTrue(col.getName(4).isDefinition()); // f () {}
assertTrue(col.getName(5).isDefinition()); // p
assertFalse(col.getName(6).isDefinition()); // struct S;
assertTrue(col.getName(7).isDefinition()); // struct S {}
assertTrue(col.getName(8).isDefinition()); // d
assertTrue(col.getName(9).isDefinition()); // X
assertFalse(col.getName(10).isDefinition()); // y
assertTrue(col.getName(11).isDefinition()); // N
assertTrue(col.getName(12).isDefinition()); // X::y
assertFalse(col.getName(15).isDefinition()); // g
assertTrue(col.getName(18).isDefinition()); // pf
}
// int f(double);
// int f(int);
// int (&rfi)(int) = f;
// int (&rfd)(double) = f;
public void testBug95200() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction f1 = (ICPPFunction) col.getName(0).resolveBinding();
ICPPFunction f2 = (ICPPFunction) col.getName(2).resolveBinding();
assertSame(col.getName(6).resolveBinding(), f2);
assertSame(col.getName(9).resolveBinding(), f1);
}
public void testBug95425() throws Exception {
IASTTranslationUnit tu = parse("class A { A(); };", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPConstructor ctor = (ICPPConstructor) col.getName(1)
.resolveBinding();
ICPPConstructor[] ctors = A.getConstructors();
assertEquals(2, ctors.length); // one user declared constructor, one copy constructor
assertSame(ctor, ctors[1]);
tu = parse("class A { A( void ); };", ParserLanguage.CPP); //$NON-NLS-1$
col = new CPPNameCollector();
tu.accept(col);
A = (ICPPClassType) col.getName(0).resolveBinding();
ctor = (ICPPConstructor) col.getName(1).resolveBinding();
ctors = A.getConstructors();
assertEquals(2, ctors.length); // one user declared constructor, one copy constructor
assertSame(ctor, ctors[1]);
}
// void f( char * );
// void g(){
// char x[100];
// f( x );
// }
public void testBug95461() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction f1 = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(f1, col.getName(4).resolveBinding());
}
// class A { };
// int f() {
// A * b = 0;
// A & c = 0;
// }
public void testAmbiguity() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration A = (IASTSimpleDeclaration) tu.getDeclarations()[0];
IASTFunctionDefinition f = (IASTFunctionDefinition) tu
.getDeclarations()[1];
IASTCompoundStatement body = (IASTCompoundStatement) f.getBody();
for (int i = 0; i < 2; ++i) {
IASTDeclarationStatement ds = (IASTDeclarationStatement) body
.getStatements()[i];
String s1 = ((IASTNamedTypeSpecifier) ((IASTSimpleDeclaration) ds
.getDeclaration()).getDeclSpecifier()).getName().toString();
String s2 = ((IASTCompositeTypeSpecifier) A.getDeclSpecifier())
.getName().toString();
assertEquals(s1, s2);
}
}
// struct A {
// int a;
// };
// struct B: virtual A { };
// struct C: B { };
// struct D: B { };
// struct E: public C, public D { };
// struct F: public A { };
// void f() {
// E e;
// e.B::a = 0;
// F f;
// f.A::a = 1;
// }
public void testBug84696() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertEquals(col.size(), 26);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
assertNotNull(A);
assertNotNull(B);
assertInstances(col, A, 4);
assertInstances(col, B, 4);
}
// class X {
// public:
// void f(int);
// int a;
// };
// int X:: * pmi = &X::a;
public void testBasicPointerToMember() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
assertEquals(tu.getDeclarations().length, 2);
IASTSimpleDeclaration p2m = (IASTSimpleDeclaration) tu
.getDeclarations()[1];
IASTDeclarator d = p2m.getDeclarators()[0];
ICPPASTPointerToMember po = (ICPPASTPointerToMember) d
.getPointerOperators()[0];
assertEquals("X::", po.getName().toString()); //$NON-NLS-1$
}
// struct B {};
// struct D : B {};
// void foo(D* dp)
// {
// B* bp = dynamic_cast<B*>(dp);
// }
public void testBug84466() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
ICPPASTCastExpression dynamic_cast = (ICPPASTCastExpression) ((IASTInitializerExpression) ((IASTSimpleDeclaration) ((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
.getDeclarations()[2]).getBody()).getStatements()[0])
.getDeclaration()).getDeclarators()[0].getInitializer())
.getExpression();
assertEquals(dynamic_cast.getOperator(),
ICPPASTCastExpression.op_dynamic_cast);
}
public void testBug88338_CPP() throws Exception {
IASTTranslationUnit tu = parse(
"struct A; struct A* a;", ParserLanguage.CPP); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
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;", ParserLanguage.CPP); //$NON-NLS-1$
col = new CPPNameCollector();
tu.accept(col);
assertTrue(col.getName(0).isDeclaration());
assertFalse(col.getName(0).isReference());
}
public void testPointerToFunction_CPP() throws Exception {
IASTTranslationUnit tu = parse("int (*pfi)();", ParserLanguage.CPP); //$NON-NLS-1$
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$
}
// class X { public: int bar; };
// void f(){
// X a[10];
// a[0].bar;
// }
public void testBug95484() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField bar = (ICPPField) col.getName(1).resolveBinding();
assertSame(bar, col.getName(6).resolveBinding());
}
// int strcmp( const char * );
// void f( const char * const * argv ){
// strcmp( *argv );
// }
public void testBug95419() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction strcmp = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(strcmp, col.getName(4).resolveBinding());
}
// class Other;
// class Base {
// public: Base( Other * );
// };
// class Sub : public Base {
// public: Sub( Other * );
// };
// Sub::Sub( Other * b ) : Base(b) {}
public void testBug95673() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ICPPConstructor ctor= ba.assertNonProblem("Base( Other", 4, ICPPConstructor.class);
ICPPConstructor ctor2= ba.assertNonProblem("Base(b)", 4, ICPPConstructor.class);
assertSame(ctor, ctor2);
}
// void mem( void *, const void * );
// void f() {
// char *x; int offset;
// mem( x, "FUNC" );
// mem( x + offset, "FUNC2" );
// }
public void testBug95768() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction mem = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(mem, col.getName(6).resolveBinding());
assertSame(mem, col.getName(8).resolveBinding());
}
// void trace( const void * );
// class Foo {
// public: int import();
// };
// int Foo::import(){
// trace( this );
// }
public void testBug95741() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction trace = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(trace, col.getName(7).resolveBinding());
}
// class RTCharacter {
// char value;
// public: operator char (void) const;
// };
// RTCharacter::operator char( void )const {
// return value;
// }
public void testBug95692() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPMethod op = (ICPPMethod) col.getName(2).resolveBinding();
assertSame(op, col.getName(6).resolveBinding());
}
// int str( const char * );
// void f(){
// str( 0 );
// str( 00 ); str( 0x0 );
// }
public void testBug95734() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction str = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(str, col.getName(3).resolveBinding());
assertSame(str, col.getName(4).resolveBinding());
assertSame(str, col.getName(5).resolveBinding());
}
// int str( bool );
// enum { ONE };
// void f( char * p ){
// str( 1.2 );
// str( ONE ); str( p );
// }
public void testBug95734_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction str = (ICPPFunction) col.getName(0).resolveBinding();
assertSame(str, col.getName(6).resolveBinding());
assertSame(str, col.getName(7).resolveBinding());
assertSame(str, col.getName(9).resolveBinding());
}
// void f() {
// char * value;
// ::operator delete(value);
// }
public void testBug95786() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertFalse(col.getName(2).resolveBinding() instanceof IProblemBinding);
}
// int foo()
// try
// {
// // function body
// }
// catch (...)
// {
// }
public void testBug86868() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
assertEquals(tu.getDeclarations().length, 1);
}
// void f( int t ){
// int s ( t );
// }
public void testBug94779() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTDeclarationStatement ds = (IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) tu
.getDeclarations()[0]).getBody()).getStatements()[0];
IASTDeclarator d = ((IASTSimpleDeclaration) ds.getDeclaration())
.getDeclarators()[0];
assertTrue(d.getName().resolveBinding() instanceof IVariable);
}
// int t= 0;
// int s ( t );
public void testBug211756() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) (tu.getDeclarations()[1]);
IASTDeclarator d = sd.getDeclarators()[0];
assertTrue(d.getName().resolveBinding() instanceof IVariable);
}
// typedef struct xs {
// int state;
// } xs;
// void f( xs *ci ) {
// ci->state;
// (ci - 1)->state;
// }
public void testBug95714() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField state = (ICPPField) col.getName(1).resolveBinding();
assertSame(state, col.getName(7).resolveBinding());
assertSame(state, col.getName(9).resolveBinding());
}
// float _Complex x;
// double _Complex y;
public void testBug95757() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true );
IASTDeclaration[] decls = tu.getDeclarations();
assertTrue(((IGPPASTSimpleDeclSpecifier)((IASTSimpleDeclaration)decls[0]).getDeclSpecifier()).isComplex());
assertEquals(((IGPPASTSimpleDeclSpecifier)((IASTSimpleDeclaration)decls[0]).getDeclSpecifier()).getType(), IASTSimpleDeclSpecifier.t_float);
assertTrue(((IGPPASTSimpleDeclSpecifier)((IASTSimpleDeclaration)decls[1]).getDeclSpecifier()).isComplex());
assertEquals(((IGPPASTSimpleDeclSpecifier)((IASTSimpleDeclaration)decls[1]).getDeclSpecifier()).getType(), IASTSimpleDeclSpecifier.t_double);
}
// class _A {
// static int i;
// };
// typedef _A A;
// void f(){
// A::i++;
// }
public void testTypedefQualified() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField i = (ICPPField) col.getName(1).resolveBinding();
assertSame(i, col.getName(7).resolveBinding());
}
// int f() {
// return 5;
// }
// int main() {
// int a( 5 );
// int b( f() );
// return a+b;
// }
public void testBug86849() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertNoProblemBindings( col );
}
// void copy( void * );
// typedef struct {} A;
// void f( A * a ) {
// copy( a );
// }
public void testBug96655() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction copy = (ICPPFunction) col.getName(0).resolveBinding();
assertSame( copy, col.getName(7).resolveBinding() );
}
public void testBug96678() throws Exception {
parse( "int x; // comment \r\n", ParserLanguage.CPP, false, true ); //$NON-NLS-1$
}
// struct A {};
// void copy( A * );
// void f( ) {
// copy( new A() );
// }
public void testNewExpressionType() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPFunction copy = (ICPPFunction) col.getName(1).resolveBinding();
assertSame( copy, col.getName(5).resolveBinding() );
}
// class A {
// A( int i = 0 );
// };
public void testDefaultConstructor() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPConstructor ctor = (ICPPConstructor) col.getName(1).resolveBinding();
ICPPConstructor [] cs = A.getConstructors();
assertTrue( cs.length == 2 );
assertSame( cs[1], ctor );
}
// class C { public: int foo; };
// class B {
// C* operator ->();
// C& operator [] ( int );
// };
// void f(){
// B b;
// b->foo;
// b[0].foo;
// }
public void testBug91707() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField foo = (ICPPField) col.getName(1).resolveBinding();
assertSame( foo, col.getName(12).resolveBinding() );
assertSame( foo, col.getName(14).resolveBinding() );
}
// class A;
// class A {
// class B;
// class C {};
// };
// class A::B{};
public void testBug92425() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPClassType A = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(2).resolveBinding();
ICPPClassType C = (ICPPClassType) col.getName(3).resolveBinding();
ICPPClassType [] classes = A.getNestedClasses();
assertEquals( classes.length, 2 );
assertSame( classes[0], B );
assertSame( classes[1], C );
}
// namespace A {
// struct F {} f;
// void f( int a) {}
// }
public void testBug92425_2() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace A = (ICPPNamespace) col.getName(0).resolveBinding();
IBinding [] bindings = A.getMemberBindings();
assertEquals( bindings.length, 3 );
assertSame( bindings[0], col.getName(1).resolveBinding() );
assertSame( bindings[1], col.getName(2).resolveBinding() );
assertSame( bindings[2], col.getName(3).resolveBinding() );
}
// A< B< C< D< E< F< G< H<int> > > > > > > > a;
// int A::B<int>::* b;
public void testBug98704() throws Exception {
parse( getAboveComment(), ParserLanguage.CPP );
}
// void f();
// void f( void ) {}
public void testBug_AIOOBE() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction f = (IFunction) col.getName(0).resolveBinding();
assertSame( f, col.getName(1).resolveBinding() );
IParameter p = (IParameter) col.getName(2).resolveBinding();
assertNotNull( p );
}
// void f( const int );
// void f( int );
// void g() { f(1); }
public void testRankingQualificationConversions_a() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertSame( col.getName(2).resolveBinding(), col.getName(5).resolveBinding() );
}
// void f( const volatile int );
// void f( const int );
// void g() { f(1); }
public void testRankingQualificationConversions_b() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertSame( col.getName(2).resolveBinding(), col.getName(5).resolveBinding() );
}
// namespace n {
// namespace m {
// class A;
// }
// }
// namespace n {
// namespace m {
// class A { void f(); };
// }
// }
// namespace n {
// namespace m {
// void A::f(){}
// }
// }
public void testBug98818() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPNamespace n = (ICPPNamespace) col.getName(0).resolveBinding();
ICPPNamespace m = (ICPPNamespace) col.getName(1).resolveBinding();
assertSame( n, col.getName(3).resolveBinding() );
assertSame( n, col.getName(7).resolveBinding() );
assertSame( m, col.getName(4).resolveBinding() );
assertSame( m, col.getName(8).resolveBinding() );
ICPPClassType A = (ICPPClassType) col.getName(2).resolveBinding();
assertSame( A, col.getName(5).resolveBinding() );
ICPPMethod f = (ICPPMethod) col.getName(9).resolveBinding();
assertSame( f, col.getName(11).resolveBinding() );
}
// struct A {
// struct { int i; } B;
// struct { int j; } C;
// };
// void f(){
// A a;
// a.B.i; a.C.j;
// }
public void testAnonymousStructures() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
ICPPField i = (ICPPField) col.getName(12).resolveBinding();
ICPPField j = (ICPPField) col.getName(15).resolveBinding();
assertSame( i, col.getName(2).resolveBinding() );
assertSame( j, col.getName(5).resolveBinding() );
}
public void testBug99262() throws Exception {
parse("void foo() {void *f; f=__null;}", ParserLanguage.CPP, true, true); //$NON-NLS-1$
}
// void f1(int*) {
// }
// void f2() {
// f1(__null);
// }
public void testBug240567() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
bh.assertNonProblem("f1(__null", 2, ICPPFunction.class);
}
public void testBug100408() throws Exception {
IASTTranslationUnit tu = parse( "int foo() { int x=1; (x)*3; }", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
assertNoProblemBindings( col );
}
public void testBug84478_3() throws Exception {
IASTTranslationUnit tu = parse( "void foo() { switch( int x = 4 ) { case 4: x++; break; default: break;} }", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
assertNoProblemBindings( col );
assertSame( col.getName(1).resolveBinding(), col.getName(2).resolveBinding() );
}
public void testBug84478_4() throws Exception {
IASTTranslationUnit tu = parse( "void foo() { for( int i = 0; int j = 0; ++i) {} }", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
assertNoProblemBindings( col );
}
// void f(){
// if( int x = 1 ) x++;
// else x--;
// while( int y = 2 )
// y++;
// for( int a = 1; int b = 2; b++){
// a++; b++;
// }
// }
public void testBug84478_2() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
assertNoProblemBindings( col );
IVariable x = (IVariable) col.getName(1).resolveBinding();
assertSame( x, col.getName(2).resolveBinding() );
assertSame( x, col.getName(3).resolveBinding() );
IVariable y = (IVariable) col.getName(4).resolveBinding();
assertSame( y, col.getName(5).resolveBinding() );
IVariable a = (IVariable) col.getName(6).resolveBinding();
IVariable b = (IVariable) col.getName(7).resolveBinding();
assertSame( b, col.getName(8).resolveBinding() );
assertSame( a, col.getName(9).resolveBinding() );
assertSame( b, col.getName(10).resolveBinding() );
}
// void free(void*);
// void f(char** p) {
// free(p);
// }
public void testBug100415() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
IFunction free = (IFunction) col.getName(0).resolveBinding();
assertSame(free, col.getName(4).resolveBinding());
}
// class X;
// void f() {
// class A {
// friend class X;
// };
// }
// namespace B {
// class A {
// friend class X;
// };
// }
public void testBug86688() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ICPPClassType X = (ICPPClassType) col.getName(0).resolveBinding();
assertNotSame( X, col.getName(3).resolveBinding() );
assertTrue( col.getName(3).resolveBinding() instanceof ICPPClassType );
assertSame( X, col.getName(6).resolveBinding() );
}
// class m {
// int m::f();
// };
// int m::f(){}
public void testBug100403() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ICPPMethod f = (ICPPMethod) col.getName(3).resolveBinding();
assertSame( f, col.getName(6).resolveBinding() );
}
// struct A {
// typedef int AT;
// void f1(AT);
// void f2(float);
// };
// struct B {
// typedef float BT;
// friend void A::f1(AT);
// friend void A::f2(BT);
// };
public void testBug90609() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ITypedef AT = (ITypedef) col.getName(1).resolveBinding();
ICPPMethod f1 = (ICPPMethod) col.getName(2).resolveBinding();
ICPPMethod f2 = (ICPPMethod) col.getName(5).resolveBinding();
ITypedef BT = (ITypedef) col.getName(8).resolveBinding();
assertSame( f1, col.getName(11).resolveBinding() );
assertSame( AT, col.getName(12).resolveBinding() );
assertSame( f2, col.getName(16).resolveBinding() );
assertSame( BT, col.getName(17).resolveBinding() );
}
// struct Except { int blah; };
// void f() {
// try { }
// catch ( Except * e ) {
// e->blah;
// }
// }
public void testBug103281() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
IField blah = (IField) col.getName(1).resolveBinding();
IVariable e = (IVariable) col.getName(4).resolveBinding();
assertSame( e, col.getName(5).resolveBinding() );
assertSame( blah, col.getName(6).resolveBinding() );
}
public void testBug78800() throws Exception {
parseAndCheckBindings( "class Matrix { public: Matrix & operator *(Matrix &); }; Matrix rotate, translate; Matrix transform = rotate * translate;" ); //$NON-NLS-1$
}
// struct U { static int i; };
// struct V : U { };
// struct W : U { using U::i; };
// struct X : V, W { void foo(); };
// void X::foo() {
// i;
// }
public void test10_2s3b() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP, true, true );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ICPPField i = (ICPPField) col.getName(1).resolveBinding();
ICPPUsingDeclaration using = (ICPPUsingDeclaration) col.getName(6).resolveBinding();
IBinding[] delegates = using.getDelegates();
assertEquals( delegates.length, 1 );
assertSame( i, delegates[0]);
assertSame( i, col.getName(16).resolveBinding() );
}
// 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 );
}
// 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 {
StringBuffer buffer = new StringBuffer();
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(), ParserLanguage.CPP);
assertFalse( tu.getDeclarations()[1] instanceof IASTProblemDeclaration );
buffer = new StringBuffer();
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(), ParserLanguage.CPP);
assertFalse( tu.getDeclarations()[1] instanceof IASTProblemDeclaration );
}
// class __attribute__((visibility("default"))) FooClass
// {
// int foo();
// };
// int FooClass::foo() {
// return 0;
// }
public void testBug108202() throws Exception {
parse( getAboveComment(), ParserLanguage.CPP, true, true );
}
// // Test redundant class specifiers
// class MyClass {
// int MyClass::field;
// static int MyClass::static_field;
// };
// int MyClass::static_field;
public void testBug174791() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true );
// check class
IASTSimpleDeclaration sd = (IASTSimpleDeclaration) tu.getDeclarations()[0];
ICPPASTCompositeTypeSpecifier cts = (ICPPASTCompositeTypeSpecifier) sd.getDeclSpecifier();
IASTSimpleDeclaration md = (IASTSimpleDeclaration) cts.getMembers()[0];
IASTName name = md.getDeclarators()[0].getName();
IField field = (IField) name.resolveBinding();
// would crash and/or return wrong result
assertFalse(field.isStatic());
assertFalse(field.isExtern());
assertFalse(field.isAuto());
assertFalse(field.isRegister());
md = (IASTSimpleDeclaration) cts.getMembers()[1];
name = md.getDeclarators()[0].getName();
field = (IField) name.resolveBinding();
// would crash
assertTrue(field.isStatic());
assertFalse(field.isExtern());
assertFalse(field.isAuto());
assertFalse(field.isRegister());
// check real static defn
sd = (IASTSimpleDeclaration) tu.getDeclarations()[1];
name = sd.getDeclarators()[0].getName();
field = (IField) name.resolveBinding();
assertTrue(field.isStatic());
}
// namespace nsSplit {}
// namespace nsSplit {
// void a();
// }
// void nsSplit::a() {
// }
public void testBug180979() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true );
// check class
IASTFunctionDefinition fd = (IASTFunctionDefinition) tu.getDeclarations()[2];
IASTDeclarator fdecl= fd.getDeclarator();
IASTName name= fdecl.getName();
IBinding binding= name.resolveBinding();
assertTrue(binding instanceof IFunction);
assertFalse(binding instanceof IProblemBinding);
}
// #define _GLIBCXX_VISIBILITY(V) __attribute__ ((__visibility__ (#V)))
// #define _GLIBCXX_BEGIN_NAMESPACE(X) namespace X _GLIBCXX_VISIBILITY(default) {
// _GLIBCXX_BEGIN_NAMESPACE(std)
// } // end the namespace
public void testBug195701() throws Exception {
parse( getAboveComment(), ParserLanguage.CPP, true, true );
}
// class A {
// double operator*(const A&);
// };
// class B : public A {
// double operator*(double);
// using A::operator*;
// };
public void testBug178059() throws Exception {
parse( getAboveComment(), ParserLanguage.CPP, true, true );
}
// void foo (void *p) throw () ;
// void bar (void *p) __attribute__ (( __nonnull__(1) ));
// void zot (void *p) throw () __attribute__ (( __nonnull__(1) ));
public void testBug179712() throws Exception {
parse( getAboveComment(), ParserLanguage.CPP, true, true );
}
// class C {
// public:
// int i;
// };
//
// void problem1(int x) {}
// void problem2(const int *x) {}
// void problem3(int* x) {}
//
// void nonproblem1(bool x) {}
// void problem4(bool* x) {}
// void problem5(const bool* x) {}
//
// void f() {
// int C::* ptm;
//
// problem1("p");
// problem2("p");
// problem3("p");
// nonproblem1("p");
// problem4("p");
// problem5("p");
//
// problem1(ptm);
// problem2(ptm);
// problem3(ptm);
// nonproblem1(ptm);
// problem4(ptm);
// problem5(ptm);
// }
public void testBug214335() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
IBinding b00= bh.assertProblem("problem1(\"", 8);
IBinding b01= bh.assertProblem("problem2(\"", 8);
IBinding b02= bh.assertProblem("problem3(\"", 8);
IBinding b03= bh.assertNonProblem("nonproblem1(\"", 11);
IBinding b04= bh.assertProblem("problem4(\"", 8);
IBinding b05= bh.assertProblem("problem5(\"", 8);
IBinding b06= bh.assertProblem("problem1(ptm", 8);
IBinding b07= bh.assertProblem("problem2(ptm", 8);
IBinding b08= bh.assertProblem("problem3(ptm", 8);
IBinding b09= bh.assertNonProblem("nonproblem1(ptm", 11);
IBinding b10= bh.assertProblem("problem4(ptm", 8);
IBinding b11= bh.assertProblem("problem5(ptm", 8);
assertInstance(b03, ICPPFunction.class);
assertInstance(b09, ICPPFunction.class);
}
// namespace source {
// class cls {
// };
// void fs();
// void fs(int a);
//
// }
// void test1() {
// source::fs();
// source::fs(1);
// source::cls c2;
// }
//
// using source::cls;
// using source::fs;
//
// void test() {
// cls c2;
// fs();
// fs(1);
// }
public void testReferencesOfUsingDecls() throws Exception {
IASTTranslationUnit tu = parse( getAboveComment(), ParserLanguage.CPP, true, true );
IASTDeclaration[] decls = tu.getDeclarations();
ICPPASTNamespaceDefinition nsdef= (ICPPASTNamespaceDefinition) decls[0];
ICPPASTUsingDeclaration udcl= (ICPPASTUsingDeclaration) decls[2];
ICPPASTUsingDeclaration udf= (ICPPASTUsingDeclaration) decls[3];
IASTFunctionDefinition fdef= (IASTFunctionDefinition) decls[4];
IASTDeclaration[] nsdecls= nsdef.getDeclarations();
ICPPASTCompositeTypeSpecifier cldef= (ICPPASTCompositeTypeSpecifier) ((IASTSimpleDeclaration) nsdecls[0]).getDeclSpecifier();
ICPPASTFunctionDeclarator fdecl1= (ICPPASTFunctionDeclarator) ((IASTSimpleDeclaration) nsdecls[1]).getDeclarators()[0];
ICPPASTFunctionDeclarator fdecl2= (ICPPASTFunctionDeclarator) ((IASTSimpleDeclaration) nsdecls[2]).getDeclarators()[0];
IASTStatement[] stmts= ((IASTCompoundStatement) fdef.getBody()).getStatements();
IASTName clname= ((IASTNamedTypeSpecifier) ((IASTSimpleDeclaration)((IASTDeclarationStatement) stmts[0]).getDeclaration()).getDeclSpecifier()).getName();
IASTName fnname1= ((IASTIdExpression) ((IASTFunctionCallExpression) ((IASTExpressionStatement) stmts[1]).getExpression()).getFunctionNameExpression()).getName();
IASTName fnname2= ((IASTIdExpression) ((IASTFunctionCallExpression) ((IASTExpressionStatement) stmts[2]).getExpression()).getFunctionNameExpression()).getName();
// check class
IBinding b= cldef.getName().resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(2, tu.getDefinitionsInAST(b).length); // class-def + using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // class-def + using-decl
// check functions
b= fdecl1.getName().resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(1, tu.getDefinitionsInAST(b).length); // using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // func-decl + using-decl
b= fdecl2.getName().resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(1, tu.getDefinitionsInAST(b).length); // using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // func-decl + using-decl
// check using declaration class
b= udcl.getName().resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(2, tu.getDefinitionsInAST(b).length); // class-def + using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // class-def + using-decl
// check using declaration function
b= udf.getName().resolveBinding();
assertEquals(5, tu.getReferences(b).length); // 4 refs + using-decl
assertEquals(1, tu.getDefinitionsInAST(b).length); // using-decl
assertEquals(3, tu.getDeclarationsInAST(b).length); // using-decl + 2 func-decls
// check class reference
b= clname.resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(2, tu.getDefinitionsInAST(b).length); // class-def + using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // class-def + using-decl
// check function references
b= fnname1.resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(1, tu.getDefinitionsInAST(b).length); // using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // using-decl + func-decl
b= fnname2.resolveBinding();
assertEquals(3, tu.getReferences(b).length); // 2 refs + using-decl
assertEquals(1, tu.getDefinitionsInAST(b).length); // using-decl
assertEquals(2, tu.getDeclarationsInAST(b).length); // using-decl + func-decl
}
// namespace x {
// int a;
// }
// using namespace x;
// class O {
// class I {
// void f();
// };
// };
// void O::I::f() {
// a=0;
// }
public void testUsingDirectiveWithNestedClass_Bug209582() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
IBinding b= bh.assertNonProblem("a=", 1);
assertEquals("x", b.getScope().getScopeName().toString());
}
// class Test {
// public:
// Test(int, int *) {}
// Test(int *) {}
// };
// void test () {
// int bar= 0;
// int * pBar = &bar;
// Test foo1 (bar, &bar);
// Test foo2 (bar, pBar);
// Test foo3 (&bar);
// }
public void testCastAmbiguity_Bug211756() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
bh.assertNonProblem("foo1", 4);
bh.assertNonProblem("foo2", 4);
bh.assertNonProblem("foo3", 4);
}
// int foo2() {
// int relayIndex = -1;
// int numRelays = 0;
// if( relayIndex < 0 || relayIndex > numRelays )
// return 0;
// }
public void testTemplateIDAmbiguity_Bug104706() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
bh.assertNonProblem("relayIndex <", 10);
bh.assertNonProblem("relayIndex >", 10);
bh.assertNonProblem("numRelays )", 9);
}
// template<typename A, typename B>
// struct and_ : public integral_constant<bool, (A::value && B::value)> {
// };
// template<typename A, typename B>
// struct or_ : public integral_constant<bool, (A::value || B::value)> {
// };
// template <class T> struct is_pod
// : integral_constant<bool, (is_integral<T>::value ||
// is_floating_point<T>::value ||
// is_pointer<T>::value)> { };
//
// typedef base::integral_constant<bool,
// (base::has_trivial_copy<value_type>::value &&
// base::has_trivial_destructor<value_type>::value)>
// realloc_ok;
public void testTemplateIDAmbiguity_Bug228118() throws Exception {
parse(getAboveComment(), ParserLanguage.CPP);
}
// namespace ns {
// class cl {};
// void func(cl c);
// }
// using ns::cl;
// void test() {
// ns::cl qualified;
// cl unqualified;
// func(qualified);
// func(unqualified);
// }
public void testScopeOfUsingDelegates_Bug219424() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
bh.assertNonProblem("cl c", 2);
bh.assertNonProblem("func(qualified)", 4);
bh.assertNonProblem("func(unqualified)", 4);
}
// class Test {
// void Test::member1();
// void Test::member2() {};
// };
// void Test::member1(){
// member2();
// }
public void testQualifiedMemberDeclaration_Bug222026() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
IBinding b= bh.assertNonProblem("member1", 7);
IBinding b2= bh.assertNonProblem("member1(){", 7);
assertTrue(b instanceof ICPPMethod);
ICPPMethod m1= (ICPPMethod) b;
assertEquals("member1", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
bh= new BindingAssertionHelper(code, true);
b= bh.assertNonProblem("member2", 7);
b2= bh.assertNonProblem("member2();", 7);
assertTrue(b instanceof ICPPMethod);
m1= (ICPPMethod) b;
assertEquals("member2", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
// different resolution order
bh= new BindingAssertionHelper(code, true);
b2= bh.assertNonProblem("member1(){", 7);
b= bh.assertNonProblem("member1", 7);
assertTrue(b instanceof ICPPMethod);
m1= (ICPPMethod) b;
assertEquals("member1", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
bh= new BindingAssertionHelper(code, true);
b2= bh.assertNonProblem("member2();", 7);
b= bh.assertNonProblem("member2", 7);
assertTrue(b instanceof ICPPMethod);
m1= (ICPPMethod) b;
assertEquals("member2", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
}
// namespace Test {
// void Test::member1();
// void Test::member2() {};
// }
// void Test::member1(){
// member2();
// }
public void testQualifiedMemberDeclarationInNamespace_Bug222026() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
IBinding b= bh.assertNonProblem("member1", 7);
IBinding b2= bh.assertNonProblem("member1(){", 7);
assertTrue(b instanceof ICPPFunction);
ICPPFunction m1= (ICPPFunction) b;
assertEquals("member1", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
bh= new BindingAssertionHelper(code, true);
b= bh.assertNonProblem("member2", 7);
b2= bh.assertNonProblem("member2();", 7);
assertTrue(b instanceof ICPPFunction);
m1= (ICPPFunction) b;
assertEquals("member2", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
// different resolution order
bh= new BindingAssertionHelper(code, true);
b2= bh.assertNonProblem("member1(){", 7);
b= bh.assertNonProblem("member1", 7);
assertTrue(b instanceof ICPPFunction);
m1= (ICPPFunction) b;
assertEquals("member1", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
bh= new BindingAssertionHelper(code, true);
b2= bh.assertNonProblem("member2();", 7);
b= bh.assertNonProblem("member2", 7);
assertTrue(b instanceof ICPPFunction);
m1= (ICPPFunction) b;
assertEquals("member2", m1.getName());
assertEquals("Test", m1.getScope().getScopeName().toString());
assertSame(b, b2);
}
// namespace ns { typedef int ns::TINT; } // illegal, still no CCE is expected.
public void testQualifiedTypedefs_Bug222093() throws Exception{
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
IBinding td= bh.assertProblem("TINT", 4);
bh.assertProblem("ns::", 2);
}
// void func() {
// int a, b;
// a < b || (a==b && a < b);
// if (a > b) {
// }
// }
public void testResettingTemplateIdScopesStack_Bug223777() throws Exception{
parseAndCheckBindings(getAboveComment());
}
// long x= 10L;
public void testLongLiteral_225534() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
IASTDeclarator decltor= ((IASTSimpleDeclaration)tu.getDeclarations()[0]).getDeclarators()[0];
IASTInitializerExpression init= (IASTInitializerExpression) decltor.getInitializer();
ICPPASTLiteralExpression exp= (ICPPASTLiteralExpression) init.getExpression();
ICPPBasicType type= (ICPPBasicType) exp.getExpressionType();
assertTrue(type.isLong());
}
// void foo/*_a*/(int x) {}
// void foo/*_b*/(unsigned int) {}
// void foo/*_c*/(short x) {}
// void foo/*_d*/(unsigned short x) {}
// void foo/*_e*/(long x) {}
// void foo/*_f*/(unsigned long x) {}
// void foo/*_g*/(long long x) {}
// void foo/*_h*/(unsigned long long x) {}
// void foo/*_i*/(float x) {}
// void foo/*_j*/(double x) {}
// void foo/*_k*/(long double x) {}
//
// int main() {
// foo/*a1*/(1);
// foo/*a2*/(010);
// foo/*a3*/(0x010);
//
// foo/*b1*/(1U);
// foo/*b2*/(010U);
// foo/*b3*/(0x010U);
//
// /*c*/ /*d*/
//
// foo/*e1*/(1L);
// foo/*e2*/(010L);
// foo/*e3*/(0x010L);
//
// foo/*f1*/(1UL);
// foo/*f2*/(010UL);
// foo/*f3*/(0x010UL);
//
// foo/*g1*/(100000000000000000LL);
// foo/*g2*/(0100000000000LL);
// foo/*g3*/(0x01000000000LL);
//
// foo/*h1*/(100000000000000000ULL);
// foo/*h2*/(0100000000000ULL);
// foo/*h3*/(0x01000000000ULL);
//
// foo/*i1*/(11.1F);
// foo/*i2*/(11E1F);
//
// foo/*j1*/(11.1);
// foo/*j2*/(11.1E1);
//
// foo/*k1*/(11.1L);
// foo/*k2*/(11.1E1L);
// }
public void testLiteralsViaOverloads_225534() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
char[] cs= {'a','b','e','f','g','h','i','j','k'};
for(char c : cs) {
for(int i=1; i<(c < 'i' ? 4 : 3); i++) {
ICPPFunction def= ba.assertNonProblem("foo/*_"+c+"*/", 3, ICPPFunction.class);
ICPPFunction ref= ba.assertNonProblem("foo/*"+c+""+i+"*/", 3, ICPPFunction.class);
assertSame("function ref: "+c+""+i, def, ref);
}
}
}
// class A {
// public:
// void doA() {}
// };
//
// class FirstLevelProxy {
// public:
// A* operator->() {A *a = new A(); return a;} // leaky
// void doFLP() {}
// };
//
// class SecondLevelProxy {
// public:
// FirstLevelProxy operator->() {FirstLevelProxy p; return p;}
// void doSLP() {}
// };
//
// int main(int argc, char **argv) {
// SecondLevelProxy p2;
// p2->doA();
// }
public void testRecursiveUserDefinedFieldAccess_Bug205964() throws Exception {
parseAndCheckBindings(getAboveComment());
}
// namespace ns {
// class A {};
// }
//
// using ns::A;
//
// class B: public A {};
public void testBug235196() throws Exception {
parseAndCheckBindings(getAboveComment());
}
// typedef int tint;
// class X {
// typedef int xtint;
// X();
// ~X();
// operator int ();
// tint(a); // 1
// };
// X::X() {}
// X::~X() {}
// X::operator int() {}
// X::xtint(a); // 2
public void testEmptyDeclSpecifier() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("X {", 1, ICPPClassType.class);
ba.assertNonProblem("X()", 1, ICPPConstructor.class);
ba.assertNonProblem("~X", 2, ICPPMethod.class);
ba.assertNonProblem("operator int", 12, ICPPMethod.class);
ba.assertNonProblem("a); // 1", 1, ICPPField.class);
ba.assertNonProblem("X() {}", 1, ICPPConstructor.class);
ba.assertNonProblem("~X() {}", 2, ICPPMethod.class);
ba.assertNonProblem("operator int() {}", 12, ICPPMethod.class);
ba.assertNonProblem("a); // 2", 1, ICPPVariable.class);
}
// void* operator new (unsigned int, int[100]);
// typedef int T;
// int p[100];
// void test(int f) {
// new T;
// new T();
// new T(f);
// new (p) T;
// new (p) T();
// new (p) T(f);
// new (T);
// new (T)();
// new (T)(f);
// new (p) (T);
// new (p) (T)();
// new (p) (T)(f);
// new T[f][f];
// new (p) T[f][f];
// new (T[f][f]);
// new (p) (T[f][f]);
// };
public void testNewPlacement() throws Exception {
IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment());
IASTFunctionDefinition fdef= getDeclaration(tu, 3);
checkNewExpression(fdef, 0, null, "int", null);
checkNewExpression(fdef, 1, null, "int", IASTExpressionList.class);
checkNewExpression(fdef, 2, null, "int", IASTIdExpression.class);
checkNewExpression(fdef, 3, IASTIdExpression.class, "int", null);
checkNewExpression(fdef, 4, IASTIdExpression.class, "int", IASTExpressionList.class);
checkNewExpression(fdef, 5, IASTIdExpression.class, "int", IASTIdExpression.class);
checkNewExpression(fdef, 6, null, "int", null);
checkNewExpression(fdef, 7, null, "int", IASTExpressionList.class);
checkNewExpression(fdef, 8, null, "int", IASTIdExpression.class);
checkNewExpression(fdef, 9, IASTIdExpression.class, "int", null);
checkNewExpression(fdef, 10, IASTIdExpression.class, "int", IASTExpressionList.class);
checkNewExpression(fdef, 11, IASTIdExpression.class, "int", IASTIdExpression.class);
checkNewExpression(fdef, 12, null, "int [] []", null);
checkNewExpression(fdef, 13, IASTIdExpression.class, "int [] []", null);
checkNewExpression(fdef, 14, null, "int [] []", null);
checkNewExpression(fdef, 15, IASTIdExpression.class, "int [] []", null);
}
private void checkNewExpression(IASTFunctionDefinition fdef, int i_expr, Class<?> placement, String type, Class<?> init) {
IASTExpression expr;
ICPPASTNewExpression newExpr;
expr= getExpressionOfStatement(fdef, i_expr);
assertInstance(expr, ICPPASTNewExpression.class);
newExpr= (ICPPASTNewExpression) expr;
if (placement == null) {
assertNull(newExpr.getNewPlacement());
} else {
assertInstance(newExpr.getNewPlacement(), placement);
}
if (init == null) {
assertNull(newExpr.getNewInitializer());
} else {
assertInstance(newExpr.getNewInitializer(), init);
}
isTypeEqual(CPPVisitor.createType(newExpr.getTypeId()), type);
}
// namespace ns {
// void test() {}
// +
// }
public void testTrailingSyntaxErrorInNamespace() throws Exception {
final String comment= getAboveComment();
IASTTranslationUnit tu= parse(comment, ParserLanguage.CPP, false, false);
ICPPASTNamespaceDefinition ns= getDeclaration(tu, 0);
IASTDeclaration decl= getDeclaration(ns, 0);
IASTProblemDeclaration pdecl= getDeclaration(ns, 1);
assertEquals("+", pdecl.getRawSignature());
}
// extern "C" {
// void test() {}
// +
// }
public void testTrailingSyntaxErrorInLinkageSpec() throws Exception {
final String comment= getAboveComment();
IASTTranslationUnit tu= parse(comment, ParserLanguage.CPP, false, false);
ICPPASTLinkageSpecification ls= getDeclaration(tu, 0);
IASTDeclaration decl= getDeclaration(ls, 0);
IASTProblemDeclaration pdecl= getDeclaration(ls, 1);
assertEquals("+", pdecl.getRawSignature());
}
// class C;
// void func(void (C::*m)(int) const);
public void test233889_a() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction func= bh.assertNonProblem("func(", 4, ICPPFunction.class);
assertEquals(1,func.getParameters().length);
IType type= func.getParameters()[0].getType();
ICPPPointerToMemberType ptm= assertInstance(type, ICPPPointerToMemberType.class);
ICPPFunctionType t= ((ICPPFunctionType)ptm.getType());
assertTrue(t.isConst());
}
// struct C {
// int m1(int a);
// int m2(int a) const;
// };
//
// C* func(int (C::*m)(int) const);
// C* func(int (C::*m)(int));
//
// void ref() {
// func(&C::m1);
// func(&C::m2);
// }
public void testBug233889_b() throws Exception {
BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction fn1= bh.assertNonProblem("func(&C::m1", 4, ICPPFunction.class);
ICPPFunction fn2= bh.assertNonProblem("func(&C::m2", 4, ICPPFunction.class);
assertNotSame(fn1, fn2);
}
// class A;
//
// void foo(A* a) {}
// void foo(const A* a) {}
// void foo(volatile A* a) {}
// void foo(const volatile A* a) {}
//
// class A {
// public:
// void member1() { foo(this);/*1*/ }
// void member2() const { foo(this);/*2*/ }
// void member3() volatile { foo(this);/*3*/ }
// void member4() const volatile { foo(this);/*4*/ }
// };
public void testThisType() throws Exception {
BindingAssertionHelper ba=new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction pt1= ba.assertNonProblem("foo(this);/*1*/", 3, ICPPFunction.class);
ICPPFunction pt2= ba.assertNonProblem("foo(this);/*2*/", 3, ICPPFunction.class);
ICPPFunction pt3= ba.assertNonProblem("foo(this);/*3*/", 3, ICPPFunction.class);
ICPPFunction pt4= ba.assertNonProblem("foo(this);/*4*/", 3, ICPPFunction.class);
IType t1= ((IPointerType)pt1.getType().getParameterTypes()[0]).getType();
IQualifierType t2= (IQualifierType) ((IPointerType) pt2.getType().getParameterTypes()[0]).getType();
IQualifierType t3= (IQualifierType)((IPointerType) pt3.getType().getParameterTypes()[0]).getType();
IQualifierType t4= (IQualifierType)((IPointerType) pt4.getType().getParameterTypes()[0]).getType();
assertTrue(!(t1 instanceof IQualifierType));
assertTrue(t2.isConst()); assertTrue(!t2.isVolatile());
assertTrue(!t3.isConst()); assertTrue(t3.isVolatile());
assertTrue(t4.isConst()); assertTrue(t4.isVolatile());
}
// class A {
// public:
// void foo() {}
// };
//
// void ref() {
// A a1= *new A();
// a1->foo();/*1*/
// A* a2= new A();
// a2->foo();/*2*/
// }
public void testMemberAccessOperator_a() throws Exception {
BindingAssertionHelper ba=new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("foo();/*1*/", 3);
ba.assertNonProblem("foo();/*2*/", 3);
}
// class A {
// public:
// void foo() {};
// };
//
// class B {
// public:
// void foo() {};
// A* operator->() {return new A();}
// };
//
// void ref() {
// B b= *new B();
// b->foo();/*1*/
// B* b2= new B();
// b2->foo();/*2*/
// }
public void testMemberAccessOperator_b() throws Exception {
BindingAssertionHelper ba=new BindingAssertionHelper(getAboveComment(), true);
ICPPMethod m1= ba.assertNonProblem("foo();/*1*/", 3, ICPPMethod.class);
ICPPMethod m2= ba.assertNonProblem("foo();/*2*/", 3, ICPPMethod.class);
assertEquals(m1.getClassOwner().getName(), "A");
assertEquals(m2.getClassOwner().getName(), "B");
}
// class A { public: void foo(); };
// class B { public: A* operator->() {return new A();} };
// class C { public: B operator->() {return *new B();} };
//
// void ref() {
// C c;
// c->foo();/**/ // refers to A::foo
// }
public void testMemberAccessOperator_c() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("foo();/**/", 3);
}
// class A { public: void foo(); };
// class B { public: A* operator->() {return new A();} };
// class C { public: B* operator->() {return new B();} };
//
// void ref() {
// C c;
// c->foo();/**/ // expect problem - foo is not in B
// }
public void testMemberAccessOperator_d() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("foo();/**/", 3);
}
// class A { public: void foo(); };
// typedef A A2;
// class B { public: A2* operator->() {return new A();} };
// typedef B B2;
// class C { public: B2 operator->() {return *new B();} };
//
// typedef C C2;
// void ref() {
// C2 c;
// c->foo();/**/ // refers to A::foo
// }
public void testMemberAccessOperator_e() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("foo();/**/", 3);
}
// namespace std {class type_info{public: const char* name() const;};}
// int main() {
// int s;
// typeid(int).name();
// typeid(s).name();
// }
public void testTypeid_Bug209578() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// typedef int int5[5];
//
// void f1(int* x);
// void f2(int** x);
// void f3(int5 x);
// void f4(int5* x);
//
// void test(int5 p, int5* q, int* r, int** s) {
// f1(p);
// f2(q);
// f3(r);
// f4(s);
// }
public void testArrayToPointerConversion() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("f1(p)", 2, ICPPFunction.class);
ba.assertProblem("f2(q)", 2);
ba.assertNonProblem("f3(r)", 2, ICPPFunction.class);
ba.assertProblem("f4(s)", 2);
}
// typedef char* t1;
// typedef char t2[8];
// typedef char* charp;
// void test(charp x) {}
// int main(void) {
// char x[12];
// t1 y;
// t2 z;
// test(x);
// test(y);
// test(z);
// }
public void testArrayToPtrConversionForTypedefs_Bug239931() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// typedef char t[12];
// void test1(char *);
// void test2(char []);
// void test3(t);
// void xx() {
// char* x= 0;
// test1(x);
// test2(x); // problem binding here
// test3(x); // problem binding here
// }
public void testAdjustmentOfParameterTypes_Bug239975() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// class A {
// public:
// void m(int c);
// };
//
// void test(char c) {
// void (A::* ptr2mem)(char);
// ptr2mem= reinterpret_cast<void (A::*)(char)>(&A::m);
// ptr2mem= (void (A::*)(int))(0);
// }
public void testTypeIdForPtrToMember_Bug242197() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// void restrict();
public void testRestrictIsNoCPPKeyword_Bug228826() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP, false);
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP, true); // even with gnu extensions
}
// void test1();
// void test2() throw ();
// void test3() throw (int);
public void testEmptyExceptionSpecification_Bug86943() throws Exception {
IASTTranslationUnit tu= parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
IASTSimpleDeclaration d= getDeclaration(tu, 0);
ICPPASTFunctionDeclarator fdtor= (ICPPASTFunctionDeclarator) d.getDeclarators()[0];
IASTTypeId[] specs= fdtor.getExceptionSpecification();
assertEquals(0, specs.length);
assertSame(ICPPASTFunctionDeclarator.NO_EXCEPTION_SPECIFICATION, specs);
d= getDeclaration(tu, 1);
fdtor= (ICPPASTFunctionDeclarator) d.getDeclarators()[0];
specs= fdtor.getExceptionSpecification();
assertEquals(0, specs.length);
assertNotSame(ICPPASTFunctionDeclarator.NO_EXCEPTION_SPECIFICATION, specs);
d= getDeclaration(tu, 2);
fdtor= (ICPPASTFunctionDeclarator) d.getDeclarators()[0];
specs= fdtor.getExceptionSpecification();
assertEquals(1, specs.length);
}
// int test() {
// try {
// } catch (const int &ex) {
// } catch (const char &ex) {
// }
// }
public void testScopeOfCatchHandler_Bug209579() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// void func(const char& c);
// void func(char& c);
//
// void test(const char& x, char& y) {
// func(x);
// func(y);
// }
public void testOverloadedFunction_248774() throws Exception {
BindingAssertionHelper helper= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction func1= helper.assertNonProblem("func(x)", 4, ICPPFunction.class);
ICPPFunction func2= helper.assertNonProblem("func(y)", 4, ICPPFunction.class);
assertNotSame(func1, func2);
}
// struct A {
// const char& operator[](int pos) const;
// char& operator[](int pos);
// };
//
// void func(const char& c);
// void func(char& c);
//
// void test(const A& x, A& y) {
// func(x[0]);
// func(y[0]);
// }
public void testOverloadedOperator_248803() throws Exception {
BindingAssertionHelper helper= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction func1= helper.assertNonProblem("func(x[0])", 4, ICPPFunction.class);
ICPPFunction func2= helper.assertNonProblem("func(y[0])", 4, ICPPFunction.class);
assertNotSame(func1, func2);
}
// class NonVirt {
// void m();//0
// };
// class C1 : NonVirt {
// virtual void m();//1
// };
// class C2 : C1 {
// void m();//2
// };
// class C3 : C2 {
// void m(int);
// };
// class C4 : C3 {
// void m();//4
// };
// class C5 : C1 {
// void m();//5
// };
public void testOverridden_248846() throws Exception {
BindingAssertionHelper helper= new BindingAssertionHelper(getAboveComment(), true);
ICPPMethod m0= helper.assertNonProblem("m();//0", 1, ICPPMethod.class);
ICPPMethod m1= helper.assertNonProblem("m();//1", 1, ICPPMethod.class);
ICPPMethod m2= helper.assertNonProblem("m();//2", 1, ICPPMethod.class);
ICPPMethod m3= helper.assertNonProblem("m(int);", 1, ICPPMethod.class);
ICPPMethod m4= helper.assertNonProblem("m();//4", 1, ICPPMethod.class);
ICPPMethod m5= helper.assertNonProblem("m();//5", 1, ICPPMethod.class);
assertFalse(ClassTypeHelper.isVirtual(m0));
assertFalse(ClassTypeHelper.isVirtual(m3));
assertTrue(ClassTypeHelper.isVirtual(m1));
assertTrue(ClassTypeHelper.isVirtual(m2));
assertTrue(ClassTypeHelper.isVirtual(m4));
assertTrue(ClassTypeHelper.isVirtual(m5));
assertFalse(ClassTypeHelper.isOverrider(m0, m0));
assertFalse(ClassTypeHelper.isOverrider(m1, m0));
assertFalse(ClassTypeHelper.isOverrider(m2, m0));
assertFalse(ClassTypeHelper.isOverrider(m3, m0));
assertFalse(ClassTypeHelper.isOverrider(m4, m0));
assertFalse(ClassTypeHelper.isOverrider(m5, m0));
assertFalse(ClassTypeHelper.isOverrider(m0, m1));
assertFalse(ClassTypeHelper.isOverrider(m1, m1));
assertFalse(ClassTypeHelper.isOverrider(m3, m1));
assertTrue(ClassTypeHelper.isOverrider(m2, m1));
assertTrue(ClassTypeHelper.isOverrider(m4, m1));
assertTrue(ClassTypeHelper.isOverrider(m5, m1));
assertFalse(ClassTypeHelper.isOverrider(m0, m2));
assertFalse(ClassTypeHelper.isOverrider(m1, m2));
assertFalse(ClassTypeHelper.isOverrider(m2, m2));
assertFalse(ClassTypeHelper.isOverrider(m3, m2));
assertFalse(ClassTypeHelper.isOverrider(m5, m2));
assertTrue(ClassTypeHelper.isOverrider(m4, m2));
ICPPMethod[] ors= ClassTypeHelper.findOverridden(m0);
assertEquals(0, ors.length);
ors= ClassTypeHelper.findOverridden(m1);
assertEquals(0, ors.length);
ors= ClassTypeHelper.findOverridden(m2);
assertEquals(1, ors.length);
assertSame(ors[0], m1);
ors= ClassTypeHelper.findOverridden(m3);
assertEquals(0, ors.length);
ors= ClassTypeHelper.findOverridden(m4);
assertEquals(2, ors.length);
assertSame(ors[0], m2);
assertSame(ors[1], m1);
ors= ClassTypeHelper.findOverridden(m5);
assertEquals(1, ors.length);
assertSame(ors[0], m1);
}
// struct A {
// int a;
// };
//
// void test(A* p) {
// p.a; // should not resolve
// }
public void testPointerMemberAccess_245068() throws Exception {
final String comment= getAboveComment();
final boolean[] isCpps= {false, true};
for (boolean isCpp : isCpps) {
BindingAssertionHelper ba= new BindingAssertionHelper(comment, isCpp);
ba.assertProblem("a; // should not resolve", 1);
}
}
// namespace ns {
// template<typename T> class CT {};
// }
// using ns::CT<int>;
public void testTemplateIdInUsingDecl_251199() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// namespace ns {
// struct A {};
// }
//
// struct B {
// operator ns::A(); // problems on operator ns and on A
// };
public void testNamespaceQualifiedOperator_256840() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
bh.assertNonProblem("operator ns::A", 14);
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// void f();
//
// void test(int p) {
// f(p);
// }
public void testFunctionExtraArgument() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("f(p)", 1);
}
// void f(...);
//
// void test(int* p) {
// f(p);
// }
public void testVariadicFunction_2500582() throws Exception {
final String comment= getAboveComment();
final boolean[] isCpps= {false, true};
for (boolean isCpp : isCpps) {
BindingAssertionHelper ba= new BindingAssertionHelper(comment, isCpp);
ba.assertNonProblem("f(p)", 1, IFunction.class);
}
}
// struct Incomplete;
//
// void f(Incomplete* p);
// void f(...);
//
// void test() {
// // Should resolve to f(Incomplete*) since 0 can be converted to Incomplete*
// f(0);
// }
public void testVariadicFunction_2500583() throws Exception {
final String comment= getAboveComment();
final boolean[] isCpps= {false, true};
for (boolean isCpp : isCpps) {
BindingAssertionHelper ba= new BindingAssertionHelper(comment, isCpp);
IFunction decl= ba.assertNonProblem("f(Incomplete* p)", 1, IFunction.class);
IFunction func= ba.assertNonProblem("f(0)", 1, IFunction.class);
assertSame(decl, func);
}
}
// class MyClass{
// public:
// int v;
// int& operator () (int i){ return v; }
// int& operator () (int i, int j){ return v; }
// };
//
// int main(MyClass c, int i){
// c(i,i)= 0;
// c(i) = 0;
// }
public void testFunctionCallOnLHS_252695() throws Exception {
final String code = getAboveComment();
IASTTranslationUnit tu= parseAndCheckBindings(code, ParserLanguage.CPP, true);
IASTFunctionDefinition fdef= getDeclaration(tu, 1);
IASTExpressionStatement exstmt= getStatement(fdef, 0);
assertInstance(exstmt.getExpression(), IASTBinaryExpression.class);
exstmt= getStatement(fdef, 1);
assertInstance(exstmt.getExpression(), IASTBinaryExpression.class);
}
// template <int E> class A;
// class A {};
// class A;
// class B;
// template <int E> class B;
// template <int E> class B {};
public void testInvalidClassRedeclaration_254961() throws Exception {
final String code = getAboveComment();
IASTTranslationUnit tu= parse(code, ParserLanguage.CPP, true, false);
CPPNameCollector nc= new CPPNameCollector();
tu.accept(nc);
assertProblemBindings(nc, 4);
assertProblemBinding(IProblemBinding.SEMANTIC_INVALID_REDEFINITION, nc.getName(2).resolveBinding());
assertProblemBinding(IProblemBinding.SEMANTIC_INVALID_REDECLARATION, nc.getName(3).resolveBinding());
assertProblemBinding(IProblemBinding.SEMANTIC_INVALID_REDECLARATION, nc.getName(6).resolveBinding());
assertProblemBinding(IProblemBinding.SEMANTIC_INVALID_REDEFINITION, nc.getName(8).resolveBinding());
}
// struct Foo {
// void foo();
// };
// void Foo::foo(void) {
// }
public void testVoidParamInDefinition_257376() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// namespace ns {
// struct C {
// C(C* c){}
// };
// int a;
// }
// struct C {
// C(ns::C*){}
// };
// void testbla() {
// ns::C* cptr= 0;
// C c= C(cptr);
// }
public void testNoKoenigForConstructors() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// typedef void VOID;
// void donothing();
// void donothing(VOID){}
// void donothing(VOID);
// void test() {
// donothing();
// }
public void testVoidViaTypedef_Bug258694() throws Exception {
parseAndCheckBindings(getAboveComment(), ParserLanguage.CPP);
}
// struct A {
// B method(B p, int& a = y) { // B is not defined
// B b;
// int x = y + 1;
// return b;
// }
// struct B {};
// int& x = y; // y is not defined
// int y;
// };
public void testScopeOfClassMember_259460() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("B b", 1, ICPPClassType.class);
ba.assertProblem("B p", 1);
ba.assertProblem("B method", 1);
ba.assertNonProblem("y + 1;", 1, ICPPField.class);
ba.assertNonProblem("y) {", 1, ICPPField.class);
ba.assertProblem("y; // y is not defined", 1);
}
// class A {
// int method(int a = GREEN) {
// return RED;
// }
// int x = GREEN; // GREEN is not defined
// enum Color {
// RED, GREEN
// };
// };
public void testScopeOfClassMember_259648() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("GREEN)", 5, IEnumerator.class);
ba.assertNonProblem("RED;", 3, IEnumerator.class);
ba.assertProblem("GREEN;", 5);
}
// struct A {
// int& operator*();
// const int& operator*() const;
// };
// void func(int& p) {}
// void func(const int& p) {}
//
// void test(A& a, const A& b) {
// func(*a);
// func(*b);
// }
public void testSmartPointerReference_259680() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction f1= ba.assertNonProblem("func(*a)", 4, ICPPFunction.class);
ICPPFunction f2= ba.assertNonProblem("func(*b)", 4, ICPPFunction.class);
assertNotSame(f1, f2);
}
// struct C {int a;};
// void myfunc(C c) {
// return c < c.a ||
// (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a ||
// (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a ||
// (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a ||
// (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a ||
// (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a
// ))))))))))))))))))))))))))))));
// }
public void testNestedTemplateIDAmbiguity_259501() throws Exception {
final String code= getAboveComment();
parseAndCheckBindings(code);
}
// struct A {
// int a;
// };
//
// struct B {
// A operator-(B b);
// A operator+(B& b);
// A operator*(const B& b);
// A operator/(B b) const;
// A operator%(const B& b) const;
// };
//
// void test(B p1, B p2) {
// (p1 - p2).a; //1
// (p1 + p2).a; //2
// (p1 * p2).a; //3
// (p1 / p2).a; //4
// (p1 % p2).a; //5
// }
public void testOverloadedBinaryOperator_259927_1() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("a; //1", 1, ICPPField.class);
ba.assertNonProblem("a; //2", 1, ICPPField.class);
ba.assertNonProblem("a; //3", 1, ICPPField.class);
ba.assertNonProblem("a; //4", 1, ICPPField.class);
ba.assertNonProblem("a; //5", 1, ICPPField.class);
}
// struct A {
// int a;
// };
// struct B {};
// enum E { zero };
//
// A operator-(B p1, int p2);
// A operator+(int p1, const B& p2);
// A operator*(E p1, int p2);
// A operator/(int p1, const E& p2);
// A operator%(const B& p1, const B& p2);
//
// void test(B b, E e, int i) {
// (b - i).a; //1
// (i + b).a; //2
// (e * i).a; //3
// (i / e).a; //4
// (b % b).a; //5
// (b + i).a; //6
// }
public void testOverloadedBinaryOperator_259927_2() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("a; //1", 1, ICPPField.class);
ba.assertNonProblem("a; //2", 1, ICPPField.class);
ba.assertNonProblem("a; //3", 1, ICPPField.class);
ba.assertNonProblem("a; //4", 1, ICPPField.class);
ba.assertNonProblem("a; //5", 1, ICPPField.class);
ba.assertProblem("a; //6", 1);
}
// struct A {
// int x;
// };
//
// struct B {
// A& operator++(); // prefix
// A operator++(int); // postfix
// };
//
// void test(B p1, B p2) {
// (p1++).x; //1
// (++p1).x; //2
// }
public void testOverloadedUnaryOperator_259927_3() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("x; //1", 1, ICPPField.class);
ba.assertNonProblem("x; //2", 1, ICPPField.class);
}
// struct A {
// int x;
// };
// struct B { };
// A& operator++(B); // prefix
// A operator++(B, int); // postfix
//
// void test(B p1, B p2) {
// (p1++).x; //1
// (++p1).x; //2
// }
public void testOverloadedUnaryOperator_259927_4() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("x; //1", 1, ICPPField.class);
ba.assertNonProblem("x; //2", 1, ICPPField.class);
}
// struct A {
// int xx;
// };
//
//
// struct B {
// A operator*();
// A operator&();
// A operator+();
// A operator-();
// A operator!();
// A operator~();
// };
//
// int main() {
// B b;
//
// (*b).xx; // 1
// (&b).xx; // 2
// (+b).xx; // 3
// (-b).xx; // 4
// (!b).xx; // 5
// (~b).xx; // 6
// }
public void testOverloadedUnaryOperator_259927_5() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
for(int i = 1; i <=6; i++)
ba.assertNonProblem("xx; // "+i, 2, ICPPField.class);
}
// struct A {
// int xx;
// };
//
//
// struct B {
// };
//
// A operator*(B);
// A operator&(B);
// A operator+(B);
// A operator-(B);
// A operator!(B);
// A operator~(B);
//
// int main() {
// B b;
//
// (*b).xx; // 1
// (&b).xx; // 2
// (+b).xx; // 3
// (-b).xx; // 4
// (!b).xx; // 5
// (~b).xx; // 6
//}
public void testOverloadedUnaryOperator_259927_6() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
for(int i = 1; i <=6; i++)
ba.assertNonProblem("xx; // "+i, 2, ICPPField.class);
}
// int a,b,c,d ;
// class X {
// void m() {
// T* a;
// I* b;
// S1* c;
// S2* d;
// }
// typedef int T;
// int I;
// typedef int S1 (int(T)); // resolve this ambiguity first
// typedef int S2 (int(t)); // resolve this ambiguity first
// };
public void testOrderOfAmbiguityResolution_259373() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ICPPVariable a= ba.assertNonProblem("a;", 1);
assertInstance(a.getType(), IPointerType.class);
ICPPVariable b= ba.assertNonProblem("b;", 1);
assertInstance(b.getType(), IBasicType.class);
ICPPVariable c= ba.assertNonProblem("c;", 1);
assertInstance(c.getType(), IPointerType.class);
ITypedef s1= (ITypedef) ((IPointerType) c.getType()).getType();
assertInstance(((IFunctionType) s1.getType()).getParameterTypes()[0], IPointerType.class);
ICPPVariable d= ba.assertNonProblem("d;", 1);
assertInstance(d.getType(), IPointerType.class);
ITypedef s2= (ITypedef) ((IPointerType) d.getType()).getType();
assertInstance(((IFunctionType) s2.getType()).getParameterTypes()[0], IBasicType.class);
}
// namespace A {
// class X {
// friend void f(int);
// class Y {
// friend void g(int);
// };
// };
// void test() {
// f(1);
// g(1);
// }
// }
public void testFriendFunctionResolution_86368_1() throws Exception {
final String code= getAboveComment();
parseAndCheckBindings(code);
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
IFunction f1= bh.assertNonProblem("f(int)", 1);
IFunction f2= bh.assertNonProblem("f(1)", 1);
assertSame(f1, f2);
IFunction g1= bh.assertNonProblem("g(int)", 1);
IFunction g2= bh.assertNonProblem("g(1)", 1);
assertSame(g1, g2);
bh= new BindingAssertionHelper(code, true);
f2= bh.assertNonProblem("f(1)", 1);
f1= bh.assertNonProblem("f(int)", 1);
assertSame(f1, f2);
g2= bh.assertNonProblem("g(1)", 1);
g1= bh.assertNonProblem("g(int)", 1);
assertSame(g1, g2);
}
// namespace A {
// void f(int);
// }
// using A::f;
// namespace A {
// void f(char); // openReferences fails
// }
// void foo() {
// f('i');
// }
// void bar() {
// using A::f;
// f('c');
// }
public void testFriendFunctionResolution_86368_2() throws Exception {
final String code= getAboveComment();
parseAndCheckBindings(code);
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
IFunction f1= bh.assertNonProblem("f(int)", 1);
IFunction f2= bh.assertNonProblem("f('i')", 1);
assertSame(f1, f2);
IFunction g1= bh.assertNonProblem("f(char)", 1);
IFunction g2= bh.assertNonProblem("f('c')", 1);
assertSame(g1, g2);
bh= new BindingAssertionHelper(code, true);
f2= bh.assertNonProblem("f('i')", 1);
f1= bh.assertNonProblem("f(int)", 1);
assertSame(f1, f2);
g2= bh.assertNonProblem("f('c')", 1);
g1= bh.assertNonProblem("f(char)", 1);
assertSame(g1, g2);
}
// class A {
// public:
// void foo() const volatile;
// void foo() volatile;
// void foo() const;
// void foo();
// void bar() const volatile;
// void bar() volatile;
// void bar() const;
// void bar();
// };
// void A::foo() const volatile { bar();/*1*/ }
// void A::foo() volatile { bar();/*2*/ }
// void A::foo() const { bar();/*3*/ }
// void A::foo() { bar();/*4*/ }
// void test() {
// A a;
// const A ca;
// volatile A va;
// const volatile A cva;
// cva.bar();/*5*/
// va.bar();/*6*/
// ca.bar();/*7*/
// a.bar();/*8*/
// }
public void testMemberFunctionDisambiguationByCVness_238409() throws Exception {
final String code= getAboveComment();
BindingAssertionHelper bh= new BindingAssertionHelper(code, true);
ICPPMethod bar_cv= bh.assertNonProblem("bar();/*1*/", 3, ICPPMethod.class);
ICPPMethod bar_v= bh.assertNonProblem("bar();/*2*/", 3, ICPPMethod.class);
ICPPMethod bar_c= bh.assertNonProblem("bar();/*3*/", 3, ICPPMethod.class);
ICPPMethod bar= bh.assertNonProblem("bar();/*4*/", 3, ICPPMethod.class);
ICPPFunctionType bar_cv_ft= bar_cv.getType();
ICPPFunctionType bar_v_ft= bar_v.getType();
ICPPFunctionType bar_c_ft= bar_c.getType();
ICPPFunctionType bar_ft= bar.getType();
assertTrue(bar_cv_ft.isConst()); assertTrue(bar_cv_ft.isVolatile());
assertTrue(!bar_v_ft.isConst()); assertTrue(bar_v_ft.isVolatile());
assertTrue(bar_c_ft.isConst()); assertTrue(!bar_c_ft.isVolatile());
assertTrue(!bar_ft.isConst()); assertTrue(!bar_ft.isVolatile());
bar_cv= bh.assertNonProblem("bar();/*5*/", 3, ICPPMethod.class);
bar_v= bh.assertNonProblem("bar();/*6*/", 3, ICPPMethod.class);
bar_c= bh.assertNonProblem("bar();/*7*/", 3, ICPPMethod.class);
bar= bh.assertNonProblem("bar();/*8*/", 3, ICPPMethod.class);
bar_cv_ft= bar_cv.getType();
bar_v_ft= bar_v.getType();
bar_c_ft= bar_c.getType();
bar_ft= bar.getType();
assertTrue(bar_cv_ft.isConst()); assertTrue(bar_cv_ft.isVolatile());
assertTrue(!bar_v_ft.isConst()); assertTrue(bar_v_ft.isVolatile());
assertTrue(bar_c_ft.isConst()); assertTrue(!bar_c_ft.isVolatile());
assertTrue(!bar_ft.isConst()); assertTrue(!bar_ft.isVolatile());
}
// void test1(float f);
// void test1(void);
// void blabla() {
// test1(1);
// }
// enum E {e1};
// class C {};
// void test2(float f);
// void test2(C c);
// void blabla2() {
// test2(e1);
// }
public void testOverloadResolution_262191() throws Exception {
final String code= getAboveComment();
parseAndCheckBindings(code);
}
// enum E {e1};
// typedef int TInt;
// void select(int);
// void test() {
// int a= TInt(1);
// E e= E(0);
// void* h;
// select (int (h) + 1);
// }
public void testSimpleTypeConstructorExpressions() throws Exception {
final String code= getAboveComment();
parseAndCheckBindings(code);
}
// struct A {};
// A a();
//
// void f(const int& x);
//
// void test() {
// f(a());
// }
public void testBug263152_1() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("f(a())", 1);
}
// struct A {};
// A a();
//
// struct B {
// void m(const A& x);
// void m(const B& x);
// };
//
// void test(B p) {
// p.m(a());
// }
public void testBug263152_2() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("m(a())", 1, ICPPMethod.class);
}
// struct A {
// int a;
// static void m() {
// a = 0;
// }
// };
public void _testInstanceMemberInStaticMethod_263154() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("a =", 1);
}
// struct A {};
// void test() {
// int B, b;
// while (A* a = 0);
// while (A* a = 0) {a= 0;}
// while (B* b) {b= 0;}
// if (A* a = 0) {a= 0;}
// if (B* b) {b= 0;}
// switch (A* a = 0) {case 1: a=0;}
// switch (B* b) {case1: b= 0;}
// for (;A* a = 0;) {a= 0;}
// for (;B* b;) {b= 0;}
// }
public void testAmbiguityResolutionInCondition_263158() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ba.assertNonProblem("A*", 1, ICPPClassType.class);
ba.assertNonProblem("a", 1, ICPPVariable.class);
ba.assertNonProblem("B*", 1, ICPPVariable.class);
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// void f(int x);
//
// void test(int* p, const int* q, int r[], const int s[]) {
// f(p);
// f(q);
// f(r);
// f(s);
// }
public void testPointerToNonPointerConversion_263159() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("f(p)", 1);
ba.assertProblem("f(q)", 1);
ba.assertProblem("f(r)", 1);
ba.assertProblem("f(s)", 1);
}
// void fip(int* x);
// void fia(int x[]);
//
// void test() {
// fip(1);
// fia(1);
// fip(0);
// fia(0);
// }
public void testNonPointerToPointerConversion_263707() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("fip(1)", 3);
ba.assertProblem("fia(1)", 3);
ba.assertNonProblem("fip(0)", 3, ICPPFunction.class);
ba.assertNonProblem("fia(0)", 3, ICPPFunction.class);
}
// class cl {};
// typedef cl tl;
// void reset(cl* ptr){};
// void blatest() {
// reset(new tl());
// reset(new cl());
// reset(new cl[1]);
// }
public void testTypeOfNewExpression_264163() throws Exception {
String code= getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// template<typename IteratorT> class range {
// public:
// template<class Range> range(const Range& r) {}
// };
// void onRange(const range<const char*>& r) {}
// void test() {
// range<char*> ir(0);
// onRange(ir);
// }
public void testConstructorTemplateInImplicitConversion_264314() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ba.assertNonProblem("onRange(ir)", 7);
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// typedef int * pi;
// typedef int *const* pcpi;
// typedef const pi* pcpi2;
// void check(pcpi) {};
// void testxxx() {
// pcpi p1;
// pcpi2 p2;
// check(p1);
// check(p2);
// }
// template<typename T> class CT {};
// CT<pcpi> ct1;
// CT<pcpi2> ct2;
public void testConstTypedef_264474() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ba.assertNonProblem("check(p2)", 5);
IBinding ct1= ba.assertNonProblem("CT<pcpi>", 8);
IBinding ct2= ba.assertNonProblem("CT<pcpi2>", 9);
assertSame(ct1, ct2);
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// class X {
// public:
// int f;
// void m(int) {};
// void cm(int) const {};
// static int sf;
// static void sm(int) {};
// };
// int X::sf;
//
// void mpr(int X::* p){}
// void mpr(void (X::* q)(int)){}
// void mprc(void (X::* q)(int) const){}
// void mprcp(void (X::** q)(int) const){}
// void pr(int * p){}
// void pr(void (*q)(int)){}
//
// void testxxx() {
// void (X::* ptr)(int) const= &X::cm;
// mpr(&X::f);
// mpr(&X::m);
// mprc(&X::cm);
// mprcp(&ptr);
// pr(&X::sf);
// pr(&(X::sf));
// pr(&X::sm);
// pr(&(X::sm));
//
// // invalid constructs:
// mpr(&(X::f)); // cannot use parenthesis
// mpr(&(X::m)); // cannot use parenthesis
// mpr(&X::sf); // sf is static
// mpr(&X::sm); // sm is static
// mpr(&X::cm); // cm is const
// mprc(&X::m); // m is not const
// }
public void testMemberPtrs_264479() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ba.assertNonProblem("mpr(&X::f)", 3);
ba.assertNonProblem("mpr(&X::m)", 3);
ba.assertNonProblem("mprc(&X::cm)", 4);
ba.assertNonProblem("mprcp(&ptr)", 5);
ba.assertNonProblem("pr(&X::sf)", 2);
ba.assertNonProblem("pr(&(X::sf))", 2);
ba.assertNonProblem("pr(&X::sm)", 2);
ba.assertNonProblem("pr(&(X::sm))", 2);
ba.assertProblem("mpr(&(X::f))", 3);
ba.assertProblem("mpr(&(X::m))", 3);
ba.assertProblem("mpr(&X::sf)", 3);
ba.assertProblem("mpr(&X::sm)", 3);
ba.assertProblem("mpr(&X::cm)", 3);
ba.assertProblem("mprc(&X::m)", 4);
}
// void f(int x);
//
// void test(int* p) {
// f(!p);
// }
public void testTypeOfNotExpression_265779() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("f(!p)", 1);
}
// class S {
// S(int);
// };
// void test() {
// S **temp = new S*[1]; // problem on S
// temp = new S*; // problem on S
// temp = new (S*); // problem on S
// temp = new ::S*[1]; // problem on S
// temp = new ::S*; // problem on S
// temp = new (::S*); // problem on S
// }
public void testNewPointerOfClass_267168() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// void f(char *(names[2])= 0);
// void f2(const char *(n[])) {
// if (n && 1){}
// }
public void testPointerToArrayWithDefaultVal_267184() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ICPPParameter p= ba.assertNonProblem("names", 5);
assertTrue(p.hasDefaultValue());
IType t= p.getType();
assertInstance(t, IPointerType.class); // parameter of type array is converted to pointer
t= ((IPointerType) t).getType();
assertInstance(t, IPointerType.class);
t= ((IPointerType) t).getType();
assertInstance(t, IBasicType.class);
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// class X {
// virtual void pv() = 0;
// void (*ptrToFunc) ()= 0;
// };
public void testPureVirtualVsInitDeclarator_267184() throws Exception {
final String code = getAboveComment();
IASTTranslationUnit tu= parseAndCheckBindings(code, ParserLanguage.CPP);
ICPPASTCompositeTypeSpecifier ct= getCompositeType(tu, 0);
IASTSimpleDeclaration sdecl= getDeclaration(ct, 0);
ICPPASTFunctionDeclarator dtor= (ICPPASTFunctionDeclarator) sdecl.getDeclarators()[0];
assertTrue(dtor.isPureVirtual());
assertNull(dtor.getInitializer());
sdecl= getDeclaration(ct, 1);
dtor= (ICPPASTFunctionDeclarator) sdecl.getDeclarators()[0];
assertFalse(dtor.isPureVirtual());
assertNotNull(dtor.getInitializer());
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// namespace ns {
// struct S {
// int a;
// };
// }
// class A {
// public:
// operator ns::S*(){return 0;};
// };
// namespace ns {
// void bla() {
// A a;
// a.operator S *();
// }
// }
public void testLookupScopeForConversionNames_267221() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// struct A {int a;};
//
// int foo();
// int bar(A);
//
// int func() {
// bar((A){foo()});
// }
public void testBug268714() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// void f(int volatile * const * ) {}
// void f(int const volatile * const *) {}
// void test() {
// int ** x;
// f(x); // problem binding here
// }
public void testRankingOfQualificationConversion_Bug269321() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// class C {
// C& operator()() {return *this;}
// };
// void test() {
// C c;
// c()()()()()()()()()()()()()();
// }
public void testNestedOverloadedFunctionCalls_Bug283324() throws Exception {
final String code = getAboveComment();
IASTTranslationUnit tu= parseAndCheckBindings(code, ParserLanguage.CPP);
IASTFunctionDefinition test= getDeclaration(tu, 1);
IASTExpressionStatement stmt= getStatement(test, 1);
long now= System.currentTimeMillis();
IType t= stmt.getExpression().getExpressionType();
assertInstance(t, ICPPReferenceType.class);
final long time = System.currentTimeMillis() - now;
assertTrue("Lasted " + time + "ms", time < 5000);
}
// struct A { int a; };
// struct B { int b; };
//
// struct X {
// A operator+(int);
// X(int);
// };
//
// A operator+(X,X);
// B operator+(X,double);
//
// void test(X x) {
// (x + 1).a; //1
// (1 + x).a; //2
// (x + 1.0).b; //3
// }
public void testOverloadResolutionForOperators_Bug266211() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("a; //1", 1, ICPPField.class);
ba.assertNonProblem("a; //2", 1, ICPPField.class);
ba.assertNonProblem("b; //3", 1, ICPPField.class);
}
// struct A { int a; };
// struct X {
// A operator+(X);
// void m();
// };
//
// A operator+(X,double);
//
// void X::m() {
// X x;
// (x + x).a; //1
// (x + 1.0).a; //2
// }
public void testOverloadResolutionForOperators_Bug268534() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("a; //1", 1, ICPPField.class);
ba.assertNonProblem("a; //2", 1, ICPPField.class);
}
// class C {
// operator int(){return 0;}
// };
// void test(int) {}
// void ref() {
// C* c= 0;
// test(c);
// }
public void testInvalidUserDefinedConversion_Bug269729() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("test(c)", 4);
}
// int foo(char * x);
// int foo(wchar_t * x);
// int foo(char x);
// int foo(wchar_t x);
//
// int main() {
// foo("asdf");
// foo(L"asdf");
// foo('a');
// foo(L'a');
// }
public void testWideCharacterLiteralTypes_Bug270892() throws Exception {
IASTTranslationUnit tu = parse(getAboveComment(), ParserLanguage.CPP);
CPPNameCollector col = new CPPNameCollector();
tu.accept(col);
assertSame(col.getName(0).resolveBinding(), col.getName(9).resolveBinding());
assertSame(col.getName(2).resolveBinding(), col.getName(10).resolveBinding());
assertSame(col.getName(4).resolveBinding(), col.getName(11).resolveBinding());
assertSame(col.getName(6).resolveBinding(), col.getName(12).resolveBinding());
}
// namespace ns {
// struct A {};
// }
// using ns::A;
// struct A;
// A a;
public void testForwardDeclarationAfterUsing_271236() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertNonProblem("A a;", 1, ICPPClassType.class);
}
// template <class T> class Moo;
// bool getFile(Moo <class Foo> & res);
public void testScopeOfClassFwdDecl_270831() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ICPPClassType t= ba.assertNonProblem("Foo", 3, ICPPClassType.class);
IScope scope= t.getScope();
assertEquals(EScopeKind.eGlobal, scope.getKind());
}
// class C {};
// class D : public C {};
// class E {
// public: E(D) {}
// };
// void test(C c) {}
// void test(E e) {}
//
// void xx() {
// D d1;
// const D d2= D();
// test(d1); // problem binding here although test(C c) has to be selected
// test(d2); // problem binding here although test(C c) has to be selected
// }
public void testDerivedToBaseConversion_269318() throws Exception {
final String code = getAboveComment();
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
ICPPFunction t= ba.assertNonProblem("test(d1);", 4, ICPPFunction.class);
ICPPClassType ct= (ICPPClassType) t.getParameters()[0].getType();
assertEquals("C", ct.getName());
t= ba.assertNonProblem("test(d2);", 4, ICPPFunction.class);
ct= (ICPPClassType) t.getParameters()[0].getType();
assertEquals("C", ct.getName());
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// typedef enum enum_name enum_name;
public void testTypedefRecursion_285457() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ba.assertProblem("enum_name", 9);
}
// class A {
// friend inline void m(A p) {}
// };
//
// void test(A a) {
// m(a);
// }
public void _testInlineFriendFunction_284690() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
// void f(int t);
// void f(unsigned int t);
// void f(long t);
//
// enum IntEnum { i1 };
// enum UnsignedEnum { u1 = 0x7FFFFFFF, u2 };
// enum LongEnum { l1 = -1, l2 = 0x7FFFFFFF, l3 };
//
// void test() {
// f(i1);
// f(u1);
// f(l1);
// }
public void testEnumToIntConversion_285368() throws Exception {
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
ICPPFunction f1 = ba.assertNonProblem("f(i1)", 1, ICPPFunction.class);
IType t1 = f1.getType().getParameterTypes()[0];
assertTrue(t1 instanceof ICPPBasicType);
assertEquals(IBasicType.t_int, ((ICPPBasicType) t1).getType());
assertEquals(0, ((ICPPBasicType) t1).getQualifierBits());
ICPPFunction f2 = ba.assertNonProblem("f(u1)", 1, ICPPFunction.class);
IType t2 = f2.getType().getParameterTypes()[0];
assertTrue(t2 instanceof ICPPBasicType);
assertEquals(IBasicType.t_int, ((ICPPBasicType) t2).getType());
assertEquals(ICPPBasicType.IS_UNSIGNED, ((ICPPBasicType) t2).getQualifierBits());
ICPPFunction f3 = ba.assertNonProblem("f(l1)", 1, ICPPFunction.class);
IType t3 = f3.getType().getParameterTypes()[0];
assertTrue(t3 instanceof ICPPBasicType);
assertEquals(IBasicType.t_int, ((ICPPBasicType) t3).getType());
assertEquals(ICPPBasicType.IS_LONG, ((ICPPBasicType) t3).getQualifierBits());
}
}