/*******************************************************************************
* Copyright (c) 2006, 2010 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
* Andrew Ferguson (Symbian)
*******************************************************************************/
package org.eclipse.cdt.internal.index.tests;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.DOMException;
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.IParameter;
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.c.ICCompositeTypeScope;
import org.eclipse.cdt.core.index.IIndexBinding;
/**
* For testing PDOM binding resolution
*/
public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase {
public static class SingleProject extends IndexCBindingResolutionBugs {
public SingleProject() { setStrategy(new SinglePDOMTestStrategy(false)); }
public static TestSuite suite() { return suite(SingleProject.class); }
}
public static class ProjectWithDepProj extends IndexCBindingResolutionBugs {
public ProjectWithDepProj() { setStrategy(new ReferencedProject(false)); }
public static TestSuite suite() { return suite(ProjectWithDepProj.class); }
}
public static void addTests(TestSuite suite) {
suite.addTest(SingleProject.suite());
suite.addTest(ProjectWithDepProj.suite());
}
// #include <stdio.h>
// void func1(void) {
// int i = 0;
// for (i=0; i<10;i++) {
// printf("%i", i);
// }
// }
// #include "header.h"
//
// int main(void) {
// while (1) {
// func1();
// }
// return 0;
// }
public void testBug175267() throws DOMException {
IBinding b0 = getBindingFromASTName("func1()", 5);
assertTrue(b0 instanceof IFunction);
IFunction f0 = (IFunction) b0;
IParameter[] params= f0.getParameters();
assertEquals(1, params.length);
IType param= params[0].getType();
assertTrue(param instanceof IBasicType);
IType returnType= f0.getType().getReturnType();
assertTrue(returnType instanceof IBasicType);
}
// void func1(void);
// #include "header.h"
//
// int main(void) {
// void* v= func1;
// }
public void testBug181735() throws DOMException {
IBinding b0 = getBindingFromASTName("func1;", 5);
assertTrue(b0 instanceof IFunction);
}
// typedef struct {
// int utm;
// } usertype;
// void func(usertype t);
// #include "header.h"
// void test() {
// usertype ut;
// func(ut);
// }
public void testFuncWithTypedefForAnonymousStruct_190730() throws Exception {
IBinding b0 = getBindingFromASTName("func(", 4);
assertTrue(b0 instanceof IFunction);
IFunction f= (IFunction) b0;
IParameter[] pars= f.getParameters();
assertEquals(1, pars.length);
IType type= pars[0].getType();
assertInstance(type, ITypedef.class);
type= ((ITypedef) type).getType();
assertInstance(type, ICompositeType.class);
}
// typedef enum {
// eItem
// } userEnum;
// void func(userEnum t);
// #include "header.h"
// void test() {
// userEnum ut;
// func(ut);
// }
public void testFuncWithTypedefForAnonymousEnum_190730() throws Exception {
IBinding b0 = getBindingFromASTName("func(", 4);
assertTrue(b0 instanceof IFunction);
IFunction f= (IFunction) b0;
IParameter[] pars= f.getParameters();
assertEquals(1, pars.length);
IType type= pars[0].getType();
assertInstance(type, ITypedef.class);
type= ((ITypedef) type).getType();
assertInstance(type, IEnumeration.class);
assertTrue(type instanceof IEnumeration);
}
// int globalVar;
// // don't include header
// char globalVar;
public void testAstIndexConflictVariable_Bug195127() throws Exception {
fakeFailForMultiProject();
IBinding b0 = getBindingFromASTName("globalVar;", 9);
assertTrue(b0 instanceof IVariable);
IVariable v= (IVariable) b0;
IType type= v.getType();
assertTrue(type instanceof IBasicType);
assertTrue(((IBasicType) type).getKind() == IBasicType.Kind.eChar);
}
// int globalFunc();
// // don't include header
// char globalFunc();
public void testAstIndexConflictFunction_Bug195127() throws Exception {
fakeFailForMultiProject();
IBinding b0 = getBindingFromASTName("globalFunc(", 10);
assertTrue(b0 instanceof IFunction);
IFunction f= (IFunction) b0;
IType type= f.getType().getReturnType();
assertTrue(type instanceof IBasicType);
assertTrue(((IBasicType) type).getKind() == IBasicType.Kind.eChar);
}
// struct astruct {
// int member;
// };
// // don't include header
// struct astruct {
// char member;
// int additionalMember;
// };
public void testAstIndexConflictStruct_Bug195127() throws Exception {
fakeFailForMultiProject();
IBinding b0 = getBindingFromASTName("astruct", 7);
assertTrue(b0 instanceof ICompositeType);
ICompositeType ct= (ICompositeType) b0;
IField[] fields= ct.getFields();
assertEquals(2, fields.length);
IField member= fields[0];
IField additionalMember= fields[1];
if (member.getName().equals("additionalMember")) {
IField h= member; member= additionalMember; additionalMember= h;
}
assertEquals("member", member.getName());
assertEquals("additionalMember", additionalMember.getName());
IType type= member.getType();
assertTrue(type instanceof IBasicType);
assertTrue(((IBasicType) type).getKind() == IBasicType.Kind.eChar);
}
// enum anenum {
// eItem0
// };
// // don't include header
// enum anenum {
// eItem0, eItem1
// };
public void testAstIndexConflictEnumerator_Bug195127() throws Exception {
fakeFailForMultiProject();
IBinding b0 = getBindingFromASTName("anenum", 6);
assertTrue(b0 instanceof IEnumeration);
IEnumeration enumeration= (IEnumeration) b0;
IEnumerator[] enumerators= enumeration.getEnumerators();
assertEquals(2, enumerators.length);
}
// typedef int atypedef;
// // don't include header
// typedef char atypedef;
public void testAstIndexConflictTypedef_Bug195127() throws Exception {
fakeFailForMultiProject();
IBinding b0 = getBindingFromASTName("atypedef;", 8);
assertTrue(b0 instanceof ITypedef);
ITypedef t= (ITypedef) b0;
IType type= t.getType();
assertTrue(type instanceof IBasicType);
assertTrue(((IBasicType) type).getKind() == IBasicType.Kind.eChar);
}
// struct st_20070703 {
// int member;
// };
// #include "header.h"
// struct st_20070703;
// void func(struct st_20070703* x) {
// x->member= 0;
// }
public void testAstIndexStructFwdDecl_Bug195227() throws Exception {
IBinding b0 = getBindingFromASTName("member=", 6);
assertTrue(b0 instanceof IField);
}
// struct astruct {
// int member;
// };
// enum anenum {
// eItem0
// };
// #include "header.h"
// struct astruct;
// enum anenum;
// void func(struct astruct a, enum anenum b) {
// }
public void testAstIndexFwdDecl_Bug195227() throws Exception {
IBinding b0 = getBindingFromASTName("astruct;", 7);
IBinding b1 = getBindingFromASTName("anenum;", 6);
assertTrue(b0 instanceof ICompositeType);
ICompositeType t= (ICompositeType) b0;
IField[] f= t.getFields();
assertEquals(1, f.length);
assertTrue(b1 instanceof IEnumeration);
IEnumeration e= (IEnumeration) b1;
IEnumerator[] ei= e.getEnumerators();
assertEquals(1, ei.length);
b0 = getBindingFromASTName("astruct a", 7);
b1 = getBindingFromASTName("anenum b", 6);
assertTrue(b0 instanceof ICompositeType);
t= (ICompositeType) b0;
f= t.getFields();
assertEquals(1, f.length);
assertTrue(b1 instanceof IEnumeration);
e= (IEnumeration) b1;
ei= e.getEnumerators();
assertEquals(1, ei.length);
}
// // no header needed
// typedef struct {
// int member;
// } t_struct;
// typedef union {
// int member;
// } t_union;
// typedef enum {
// ei
// } t_enum;
public void testIsSameAnonymousType_Bug193962() throws DOMException {
// struct
IBinding tdAST = getBindingFromASTName("t_struct;", 8);
assertFalse(tdAST instanceof IIndexBinding);
IBinding tdIndex= strategy.getIndex().adaptBinding(tdAST);
assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef);
IType tAST= ((ITypedef) tdAST).getType();
IType tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof ICompositeType);
assertTrue(tIndex instanceof ICompositeType);
assertTrue(tAST.isSameType(tIndex));
assertTrue(tIndex.isSameType(tAST));
// union
tdAST = getBindingFromASTName("t_union;", 7);
assertFalse(tdAST instanceof IIndexBinding);
tdIndex= strategy.getIndex().adaptBinding(tdAST);
assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef);
tAST= ((ITypedef) tdAST).getType();
tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof ICompositeType);
assertTrue(tIndex instanceof ICompositeType);
assertTrue(tAST.isSameType(tIndex));
assertTrue(tIndex.isSameType(tAST));
// enum
tdAST = getBindingFromASTName("t_enum;", 6);
assertFalse(tdAST instanceof IIndexBinding);
tdIndex= strategy.getIndex().adaptBinding(tdAST);
assertTrue(tdIndex instanceof IIndexBinding);
assertTrue(tdAST instanceof ITypedef);
assertTrue(tdIndex instanceof ITypedef);
tAST= ((ITypedef) tdAST).getType();
tIndex= ((ITypedef) tdIndex).getType();
assertTrue(tAST instanceof IEnumeration);
assertTrue(tIndex instanceof IEnumeration);
assertTrue(tAST.isSameType(tIndex));
assertTrue(tIndex.isSameType(tAST));
}
// struct outer {
// union {
// int var1;
// };
// };
// #include "header.h"
// void test() {
// struct outer x;
// x.var1=1;
// }
public void testAnonymousUnion_Bug216791() throws DOMException {
// struct
IBinding b = getBindingFromASTName("var1=", 4);
assertTrue(b instanceof IField);
IField f= (IField) b;
IScope outer= f.getCompositeTypeOwner().getScope();
assertTrue(outer instanceof ICCompositeTypeScope);
assertEquals("outer", outer.getScopeName().toString());
}
// union outer {
// struct {
// int var1;
// };
// };
// #include "header.h"
// void test() {
// union outer x;
// x.var1=1;
// }
public void testAnonymousStruct_Bug216791() throws DOMException {
// struct
IBinding b = getBindingFromASTName("var1=", 4);
assertTrue(b instanceof IField);
IField f= (IField) b;
IScope outer= f.getCompositeTypeOwner().getScope();
assertTrue(outer instanceof ICCompositeTypeScope);
assertEquals("outer", outer.getScopeName().toString());
}
// int myFunc();
// int myFunc(var)
// int var;
// {
// return var;
// }
// int main(void) {
// return myFunc(0);
// }
public void testKRStyleFunction_Bug216791() throws DOMException {
// struct
IBinding b = getBindingFromASTName("myFunc(", 6);
assertTrue(b instanceof IFunction);
IFunction f= (IFunction) b;
IParameter[] params= f.getParameters();
assertEquals(1, params.length);
assertTrue(params[0].getType() instanceof IBasicType);
assertEquals(IBasicType.Kind.eInt, ((IBasicType) params[0].getType()).getKind());
}
// typedef struct S S;
// void setValue(S *pSelf, int value);
// struct S {
// int value;
// };
// void setValue(S *pSelf, int value) {
// pSelf->value = value;
// }
public void testOpaqueStruct_Bug262719() throws Exception {
IBinding b = getBindingFromASTName("value =", 5);
assertTrue(b instanceof IField);
}
// void f255(
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
// void f256(
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
// void test() {
// f255(
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
// f256(
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
// }
public void testFunctionsWithManyParameters_Bug319186() throws Exception {
getBindingFromASTName("f255", 0);
getBindingFromASTName("f256", 0);
}
// struct B {
// float f;
// };
// struct B b = {
// .f = 3.1
// };
public void testDesignatedInitializer_Bug210019() throws Exception {
IField f= getBindingFromASTName("f", 0);
}
}