1
/*******************************************************************************
2
* Copyright (c) 2006, 2010 Wind River Systems, Inc. and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* Markus Schorn - initial API and implementation
10
* Andrew Ferguson (Symbian)
11
*******************************************************************************/
12
package org.eclipse.cdt.internal.index.tests;
14
import java.util.Arrays;
15
import java.util.regex.Pattern;
17
import junit.framework.TestSuite;
19
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
20
import org.eclipse.cdt.core.dom.ast.DOMException;
21
import org.eclipse.cdt.core.dom.ast.IASTName;
22
import org.eclipse.cdt.core.dom.ast.IBinding;
23
import org.eclipse.cdt.core.dom.ast.ICompositeType;
24
import org.eclipse.cdt.core.dom.ast.IEnumeration;
25
import org.eclipse.cdt.core.dom.ast.IField;
26
import org.eclipse.cdt.core.dom.ast.IFunction;
27
import org.eclipse.cdt.core.dom.ast.IParameter;
28
import org.eclipse.cdt.core.dom.ast.IPointerType;
29
import org.eclipse.cdt.core.dom.ast.IScope;
30
import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
31
import org.eclipse.cdt.core.dom.ast.IType;
32
import org.eclipse.cdt.core.dom.ast.ITypedef;
33
import org.eclipse.cdt.core.dom.ast.IVariable;
34
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
35
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
36
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
37
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
38
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
39
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
40
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
41
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
42
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
43
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
44
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
45
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
46
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
47
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
48
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
49
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
50
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
51
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
52
import org.eclipse.cdt.core.index.IIndex;
53
import org.eclipse.cdt.core.index.IIndexBinding;
54
import org.eclipse.cdt.core.index.IIndexMacro;
55
import org.eclipse.cdt.core.index.IndexFilter;
56
import org.eclipse.cdt.core.parser.util.ObjectMap;
57
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
58
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
59
import org.eclipse.core.runtime.CoreException;
62
* For testing PDOM binding resolution
64
public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBase {
66
public static class SingleProject extends IndexCPPBindingResolutionBugs {
67
public SingleProject() {setStrategy(new SinglePDOMTestStrategy(true));}
68
public static TestSuite suite() {return suite(SingleProject.class);}
71
public static class ProjectWithDepProj extends IndexCPPBindingResolutionBugs {
72
public ProjectWithDepProj() {setStrategy(new ReferencedProject(true));}
73
public static TestSuite suite() {return suite(ProjectWithDepProj.class);}
76
public static void addTests(TestSuite suite) {
77
suite.addTest(IndexCPPBindingResolutionBugsSingleProjectFirstAST.suite());
78
suite.addTest(SingleProject.suite());
79
suite.addTest(ProjectWithDepProj.suite());
82
public static TestSuite suite() {
83
return suite(IndexCPPBindingResolutionBugs.class);
86
public IndexCPPBindingResolutionBugs() {
87
setStrategy(new SinglePDOMTestStrategy(true));
90
// #define OBJ void foo()
91
// #define FUNC() void bar()
92
// #define FUNC2(A) void baz()
95
// #include "header.h"
100
public void testBug208558() throws CoreException {
101
IIndex index= getIndex();
103
IIndexMacro[] macrosA= index.findMacros("OBJ".toCharArray(), IndexFilter.ALL, npm());
104
IIndexMacro[] macrosB= index.findMacros("FUNC".toCharArray(), IndexFilter.ALL, npm());
105
IIndexMacro[] macrosC= index.findMacros("FUNC2".toCharArray(), IndexFilter.ALL, npm());
107
assertEquals(1, macrosA.length);
108
assertEquals(1, macrosB.length);
109
assertEquals(1, macrosC.length);
110
IIndexMacro obj= macrosA[0];
111
IIndexMacro func= macrosB[0];
112
IIndexMacro func2= macrosC[0];
114
assertEquals("OBJ", new String(obj.getName()));
115
assertEquals("FUNC", new String(func.getName()));
116
assertEquals("FUNC2", new String(func2.getName()));
118
assertEquals("void foo()", new String(obj.getExpansionImage()));
119
assertEquals("void bar()", new String(func.getExpansionImage()));
120
assertEquals("void baz()", new String(func2.getExpansionImage()));
122
assertEquals("OBJ", new String(obj.getName()));
123
assertNull(obj.getParameterList());
125
assertEquals("FUNC", new String(func.getName()));
126
assertEquals(0, func.getParameterList().length);
128
assertEquals("FUNC2", new String(func2.getName()));
129
assertEquals(1, func2.getParameterList().length);
130
assertEquals("A", new String(func2.getParameterList()[0]));
132
IIndexBinding[] bindings= index.findBindings(Pattern.compile(".*"), false, IndexFilter.ALL, npm());
133
assertEquals(3, bindings.length);
135
IIndexBinding foo= index.findBindings("foo".toCharArray(), IndexFilter.ALL, npm())[0];
136
IIndexBinding bar= index.findBindings("bar".toCharArray(), IndexFilter.ALL, npm())[0];
137
IIndexBinding baz= index.findBindings("baz".toCharArray(), IndexFilter.ALL, npm())[0];
139
assertEquals("foo", foo.getName());
140
assertEquals("bar", bar.getName());
141
assertEquals("baz", baz.getName());
142
assertInstance(foo, ICPPFunction.class);
143
assertInstance(bar, ICPPFunction.class);
144
assertInstance(baz, ICPPFunction.class);
147
// template <class T>
148
// inline void testTemplate(T& aRef);
155
// testTemplate(testFile);
157
public void testBug207320() {
158
IBinding b0= getBindingFromASTName("testTemplate(", 12);
159
assertInstance(b0, ICPPFunction.class);
160
assertInstance(b0, ICPPTemplateInstance.class);
169
// typedef void TAny;
171
// inline void testCall(TAny* aExpected){}
173
// testdef* global_cBase;
174
// testdef*& global_cBaseRef = global_cBase;
176
// #include "typedefHeader.h"
181
// testdef* local_cBase;
182
// testdef*& local_cBaseRef = local_cBase;
184
// testCall( /*1*/ (void *) local_cBase);
185
// testCall( /*2*/ local_cBase);
187
// testCall( /*3*/ (void *) local_cBaseRef);
188
// testCall( /*4*/ local_cBaseRef);
190
// testCall( /*5*/ (void *) global_cBase);
191
// testCall( /*6*/ global_cBase);
193
// testCall( /*7*/ (void *)global_cBaseRef);
194
// testCall( /*8*/ global_cBaseRef);
196
public void testBug206187() throws Exception {
197
IBinding b1= getBindingFromASTName("testCall( /*1*/", 8);
198
IBinding b2= getBindingFromASTName("testCall( /*2*/", 8);
199
IBinding b3= getBindingFromASTName("testCall( /*3*/", 8);
200
IBinding b4= getBindingFromASTName("testCall( /*4*/", 8);
201
IBinding b5= getBindingFromASTName("testCall( /*5*/", 8);
202
IBinding b6= getBindingFromASTName("testCall( /*6*/", 8);
203
IBinding b7= getBindingFromASTName("testCall( /*7*/", 8);
204
IBinding b8= getBindingFromASTName("testCall( /*8*/", 8);
208
// template<typename T1>
211
// template<typename T2>
212
// class B : public A<T2> {};
218
// void foo() {C c; B<int> b;}
219
public void testBug188274() throws Exception {
220
IBinding b0= getBindingFromASTName("C", 1);
221
IBinding b1= getBindingFromASTName("B", 1);
222
assertInstance(b0, ICPPClassType.class);
223
assertInstance(b1, ICPPClassType.class);
224
assertInstance(b1, ICPPClassTemplate.class);
225
assertInstance(b1, ICPPInstanceCache.class);
227
ICPPInstanceCache ct= (ICPPInstanceCache) b1;
228
ICPPSpecialization inst= ct.getInstance(new ICPPTemplateArgument[]{new CPPTemplateArgument((IType)b0)});
229
assertInstance(inst, ICPPClassType.class);
230
ICPPClassType c2t= (ICPPClassType) inst;
231
ICPPBase[] bases= c2t.getBases();
232
assertEquals(1, bases.length);
233
assertInstance(bases[0].getBaseClass(), ICPPClassType.class);
236
// namespace ns {class A{};}
240
public void testBug188324() throws Exception {
241
IASTName name= findName("B", 1);
242
IBinding b0= getBindingFromASTName("ns::A", 2);
243
assertInstance(b0, ICPPNamespace.class);
244
ICPPNamespace ns= (ICPPNamespace) b0;
245
assertEquals(0, ns.getNamespaceScope().getBindings(name, false, false).length);
248
// template<typename T>
249
// class C : public C<T> {};
252
// C<int>::unresolvable();
254
public void testBug185828() throws Exception {
255
// Bug 185828 reports a StackOverflowException is thrown before we get here.
256
// That the SOE is thrown is detected in BaseTestCase via an Error IStatus
258
IBinding b0= getBindingFromASTName("C<int>", 1);
259
IBinding b1= getBindingFromASTName("C<int>", 6);
260
IBinding b2= getProblemFromASTName("unresolvable", 12);
262
assertInstance(b0, ICPPClassType.class);
263
assertInstance(b0, ICPPClassTemplate.class);
265
assertInstance(b1, ICPPClassType.class);
266
assertInstance(b1, ICPPSpecialization.class);
272
// T* MopGetObject(T*& aPtr)
277
// T* MopGetObjectNoChaining(T*& aPtr)
283
// MyClass* cls= new MyClass();
285
public void testBug184216() throws Exception {
286
IBinding b0= getBindingFromASTName("MyClass*", 7);
287
assertInstance(b0, ICPPClassType.class);
288
ICPPClassType ct= (ICPPClassType) b0;
289
ICPPMethod[] ms= ct.getDeclaredMethods(); // 184216 reports CCE thrown
290
assertEquals(2, ms.length);
291
assertInstance(ms[0], ICPPTemplateDefinition.class);
292
assertInstance(ms[1], ICPPTemplateDefinition.class);
300
//// referencing content
307
public void testBug166954() {
308
IBinding b0 = getBindingFromASTName("func(a)", 4);
317
// char* fooovr(int a);
318
// char* fooovr(char x);
322
// #include "header.h"
323
// void Base::foo(int i) {}
324
// int Base::fooint() {return 0;}
325
// char* Base::fooovr() {return 0;}
326
// char* Base::fooovr(int a) {return 0;}
327
// char* Base::fooovr(char x) {return 0;}
337
public void testBug168020() {
338
getBindingFromASTName("foo(int i)", 3);
339
getBindingFromASTName("fooint()", 6);
340
getBindingFromASTName("fooovr()", 6);
341
getBindingFromASTName("fooovr(int", 6);
342
getBindingFromASTName("fooovr(char", 6);
344
getBindingFromASTName("foo(1)", 3);
345
getBindingFromASTName("fooint();", 6);
346
getBindingFromASTName("fooovr();", 6);
347
getBindingFromASTName("fooovr(1", 6);
348
getBindingFromASTName("fooovr('", 6);
360
// void func2(int i);
363
// #include "header.h"
364
// void Base::foo(int i) {
367
// int Base::foo2(int j) {
370
// void func(int k) {
373
// void func2(int l) {
376
public void testBug168054() {
377
getBindingFromASTName("i=2", 1);
378
getBindingFromASTName("j=2", 1);
379
getBindingFromASTName("k=2", 1);
380
getBindingFromASTName("l=2", 1);
386
// class Ambiguity {};
387
// enum Ambiguity {A1,A2,A3};
389
// Ambiguity problem;
392
public void testBug176708_CCE() throws Exception {
393
IBinding binding= getBindingFromASTName("Y {", 1);
394
assertTrue(binding instanceof ICPPNamespace);
395
ICPPNamespace adapted= (ICPPNamespace) strategy.getIndex().adaptBinding(binding);
396
IASTName name= findName("Ambiguity problem", 9);
398
IBinding binding2= adapted.getNamespaceScope().getBinding(name, true);
401
// namespace X {int i;}
404
// #include "header.h"
406
public void testBug176708_NPE() throws Exception {
407
IBinding binding= getBindingFromASTName("i;", 1);
408
assertTrue(binding instanceof ICPPVariable);
409
IScope scope= binding.getScope();
412
// template<class T, class U, class V>
416
// class A<int, bool, double> {};
417
public void testBug180784() throws Exception {
418
IBinding b0= getBindingFromASTName("A<int, bool, double> {};", 20);
419
assertInstance(b0, ICPPSpecialization.class);
420
ICPPSpecialization s= (ICPPSpecialization) b0;
421
ObjectMap map= s.getArgumentMap();
422
IBinding b1= s.getSpecializedBinding();
423
assertInstance(b1, ICPPClassTemplate.class);
424
ICPPClassTemplate t= (ICPPClassTemplate) b1;
425
ICPPTemplateParameter[] ps = t.getTemplateParameters();
427
assertEquals(3, ps.length);
428
assertNotNull(map.get(ps[0]));
429
assertNotNull(map.get(ps[1]));
430
assertNotNull(map.get(ps[2]));
435
// template<typename T>
436
// T id (T t) {return t;}
439
// A id (A a) {return a;}
441
// int id(int x) {return x;}
447
public void testBug180948() throws Exception {
448
// Main check occurs in BaseTestCase - that no ClassCastException
449
// is thrown during indexing
450
IBinding b0= getBindingFromASTName("id(*", 2);
451
IBinding b1= getBindingFromASTName("id(6", 2);
457
// #include "header.h"
463
public void testBug181735() throws DOMException {
464
IBinding b0 = getBindingFromASTName("func1;", 5);
465
assertTrue(b0 instanceof IFunction);
476
// class A : public B::BB {};
478
// #include "header.h"
484
public void testBug183843() throws DOMException {
485
IBinding b0 = getBindingFromASTName("field;//", 5);
486
assertTrue(b0 instanceof ICPPField);
492
// void func(usertype t);
494
// #include "header.h"
499
public void testFuncWithTypedefForAnonymousStruct_190730() throws Exception {
500
IBinding b0 = getBindingFromASTName("func(", 4);
501
assertTrue(b0 instanceof IFunction);
502
IFunction f= (IFunction) b0;
503
IParameter[] pars= f.getParameters();
504
assertEquals(1, pars.length);
505
IType type= pars[0].getType();
506
assertTrue(type instanceof ITypedef);
507
type= ((ITypedef) type).getType();
508
assertTrue(type instanceof ICPPClassType);
514
// void func(userEnum t);
516
// #include "header.h"
521
public void testFuncWithTypedefForAnonymousEnum_190730() throws Exception {
522
IBinding b0 = getBindingFromASTName("func(", 4);
523
assertTrue(b0 instanceof IFunction);
524
IFunction f= (IFunction) b0;
525
IParameter[] pars= f.getParameters();
526
assertEquals(1, pars.length);
527
IType type= pars[0].getType();
528
assertTrue(type instanceof ITypedef);
529
type= ((ITypedef) type).getType();
530
assertTrue(type instanceof IEnumeration);
533
// // no header needed
547
public void testIsSameAnonymousType_Bug193962() throws DOMException {
549
IBinding tdAST = getBindingFromASTName("t_class;", 7);
550
assertFalse(tdAST instanceof IIndexBinding);
551
IBinding tdIndex= strategy.getIndex().adaptBinding(tdAST);
552
assertTrue(tdIndex instanceof IIndexBinding);
553
assertTrue(tdAST instanceof ITypedef);
554
assertTrue(tdIndex instanceof ITypedef);
556
IType tAST= ((ITypedef) tdAST).getType();
557
IType tIndex= ((ITypedef) tdIndex).getType();
558
assertTrue(tAST instanceof ICompositeType);
559
assertTrue(tIndex instanceof ICompositeType);
560
assertTrue(tAST.isSameType(tIndex));
561
assertTrue(tIndex.isSameType(tAST));
564
tdAST = getBindingFromASTName("t_struct;", 8);
565
assertFalse(tdAST instanceof IIndexBinding);
566
tdIndex= strategy.getIndex().adaptBinding(tdAST);
567
assertTrue(tdIndex instanceof IIndexBinding);
568
assertTrue(tdAST instanceof ITypedef);
569
assertTrue(tdIndex instanceof ITypedef);
571
tAST= ((ITypedef) tdAST).getType();
572
tIndex= ((ITypedef) tdIndex).getType();
573
assertTrue(tAST instanceof ICompositeType);
574
assertTrue(tIndex instanceof ICompositeType);
575
assertTrue(tAST.isSameType(tIndex));
576
assertTrue(tIndex.isSameType(tAST));
579
tdAST = getBindingFromASTName("t_union;", 7);
580
assertFalse(tdAST instanceof IIndexBinding);
581
tdIndex= strategy.getIndex().adaptBinding(tdAST);
582
assertTrue(tdIndex instanceof IIndexBinding);
583
assertTrue(tdAST instanceof ITypedef);
584
assertTrue(tdIndex instanceof ITypedef);
586
tAST= ((ITypedef) tdAST).getType();
587
tIndex= ((ITypedef) tdIndex).getType();
588
assertTrue(tAST instanceof ICompositeType);
589
assertTrue(tIndex instanceof ICompositeType);
590
assertTrue(tAST.isSameType(tIndex));
591
assertTrue(tIndex.isSameType(tAST));
594
tdAST = getBindingFromASTName("t_enum;", 6);
595
assertFalse(tdAST instanceof IIndexBinding);
596
tdIndex= strategy.getIndex().adaptBinding(tdAST);
597
assertTrue(tdIndex instanceof IIndexBinding);
598
assertTrue(tdAST instanceof ITypedef);
599
assertTrue(tdIndex instanceof ITypedef);
601
tAST= ((ITypedef) tdAST).getType();
602
tIndex= ((ITypedef) tdIndex).getType();
603
assertTrue(tAST instanceof IEnumeration);
604
assertTrue(tIndex instanceof IEnumeration);
605
assertTrue(tAST.isSameType(tIndex));
606
assertTrue(tIndex.isSameType(tAST));
609
// // no header needed
625
public void testIsSameNestedAnonymousType_Bug193962() throws DOMException {
627
IBinding tdAST = getBindingFromASTName("t_class;", 7);
628
assertFalse(tdAST instanceof IIndexBinding);
629
IBinding tdIndex= strategy.getIndex().adaptBinding(tdAST);
630
assertTrue(tdIndex instanceof IIndexBinding);
631
assertTrue(tdAST instanceof ITypedef);
632
assertTrue(tdIndex instanceof ITypedef);
634
IType tAST= ((ITypedef) tdAST).getType();
635
IType tIndex= ((ITypedef) tdIndex).getType();
636
assertTrue(tAST instanceof ICompositeType);
637
assertTrue(tIndex instanceof ICompositeType);
638
assertTrue(tAST.isSameType(tIndex));
639
assertTrue(tIndex.isSameType(tAST));
642
tdAST = getBindingFromASTName("t_struct;", 8);
643
assertFalse(tdAST instanceof IIndexBinding);
644
tdIndex= strategy.getIndex().adaptBinding(tdAST);
645
assertTrue(tdIndex instanceof IIndexBinding);
646
assertTrue(tdAST instanceof ITypedef);
647
assertTrue(tdIndex instanceof ITypedef);
649
tAST= ((ITypedef) tdAST).getType();
650
tIndex= ((ITypedef) tdIndex).getType();
651
assertTrue(tAST instanceof ICompositeType);
652
assertTrue(tIndex instanceof ICompositeType);
653
assertTrue(tAST.isSameType(tIndex));
654
assertTrue(tIndex.isSameType(tAST));
657
tdAST = getBindingFromASTName("t_union;", 7);
658
assertFalse(tdAST instanceof IIndexBinding);
659
tdIndex= strategy.getIndex().adaptBinding(tdAST);
660
assertTrue(tdIndex instanceof IIndexBinding);
661
assertTrue(tdAST instanceof ITypedef);
662
assertTrue(tdIndex instanceof ITypedef);
664
tAST= ((ITypedef) tdAST).getType();
665
tIndex= ((ITypedef) tdIndex).getType();
666
assertTrue(tAST instanceof ICompositeType);
667
assertTrue(tIndex instanceof ICompositeType);
668
assertTrue(tAST.isSameType(tIndex));
669
assertTrue(tIndex.isSameType(tAST));
672
tdAST = getBindingFromASTName("t_enum;", 6);
673
assertFalse(tdAST instanceof IIndexBinding);
674
tdIndex= strategy.getIndex().adaptBinding(tdAST);
675
assertTrue(tdIndex instanceof IIndexBinding);
676
assertTrue(tdAST instanceof ITypedef);
677
assertTrue(tdIndex instanceof ITypedef);
679
tAST= ((ITypedef) tdAST).getType();
680
tIndex= ((ITypedef) tdIndex).getType();
681
assertTrue(tAST instanceof IEnumeration);
682
assertTrue(tIndex instanceof IEnumeration);
683
assertTrue(tAST.isSameType(tIndex));
684
assertTrue(tIndex.isSameType(tAST));
692
// BAR::Bar * Test(BAR::Bar * bar);
696
// #include "header.h"
700
// Bar* Foo::Test(Bar* pBar) {
704
public void testAdvanceUsingDeclaration_Bug217102() throws Exception {
705
IBinding cl = getBindingFromASTName("Bar* Foo", 3);
707
assertEquals("Bar", cl.getName());
708
assertTrue(cl instanceof ICPPClassType);
709
assertEquals("BAR", cl.getScope().getScopeName().toString());
711
cl = getBindingFromASTName("Bar* pBar", 3);
712
assertEquals("Bar", cl.getName());
713
assertTrue(cl instanceof ICPPClassType);
714
assertEquals("BAR", cl.getScope().getScopeName().toString());
723
// #include "header.h"
728
public void testAnonymousUnion_Bug216791() throws DOMException {
730
IBinding b = getBindingFromASTName("var1=", 4);
731
assertTrue(b instanceof IField);
732
IField f= (IField) b;
733
IScope outer= f.getCompositeTypeOwner().getScope();
734
assertTrue(outer instanceof ICPPClassScope);
735
assertEquals("outer", outer.getScopeName().toString());
747
// #include "header.h"
751
// x.var2= 2; // must be a problem
753
public void testAnonymousStruct_Bug216791() throws DOMException {
755
IBinding b = getBindingFromASTName("var1=", 4);
756
assertTrue(b instanceof IField);
757
IField f= (IField) b;
758
IScope outer= f.getCompositeTypeOwner().getScope();
759
assertTrue(outer instanceof ICPPClassScope);
760
assertEquals("outer", outer.getScopeName().toString());
762
getProblemFromASTName("var2=", 4);
768
// using namespace ns;
770
// #include "header.h"
774
public void testUsingDirective_Bug216527() throws Exception {
775
IBinding b = getBindingFromASTName("v=", 1);
776
assertTrue(b instanceof IVariable);
777
IVariable v= (IVariable) b;
778
IScope scope= v.getScope();
779
assertTrue(scope instanceof ICPPNamespaceScope);
780
assertEquals("ns", scope.getScopeName().toString());
790
// using namespace NSA;
791
// using namespace NSB;
794
// #include "header.h"
798
public void testNamespaceComposition_Bug200673() throws Exception {
799
IBinding a = getBindingFromASTName("a=", 1);
800
assertTrue(a instanceof IVariable);
801
IVariable v= (IVariable) a;
802
IScope scope= v.getScope();
803
assertTrue(scope instanceof ICPPNamespaceScope);
804
assertEquals("NSA", scope.getScopeName().toString());
806
IBinding b = getBindingFromASTName("b;", 1);
807
assertTrue(b instanceof IVariable);
810
assertTrue(scope instanceof ICPPNamespaceScope);
811
assertEquals("NSB", scope.getScopeName().toString());
814
// namespace N { namespace M {}}
816
// namespace N {using namespace N::M;}
817
// using namespace N;
819
public void testEndlessLoopWithUsingDeclaration_Bug209813() throws DOMException {
820
getProblemFromASTName("x;", 1);
825
// void test(MyClass* ptr);
827
public void testClassRedeclarationAfterReference_Bug229571() throws Exception {
828
IBinding cl= getBindingFromASTName("MyClass;", 7);
829
IFunction fn= getBindingFromASTName("test(", 4, IFunction.class);
830
IType type= fn.getType().getParameterTypes()[0];
831
assertInstance(type, IPointerType.class);
832
type= ((IPointerType) type).getType();
833
assertSame(type, cl);
838
// void foo() const volatile;
839
// void foo() volatile;
842
// void bar() const volatile;
843
// void bar() volatile;
848
// void A::foo() const volatile { bar();/*1*/ }
849
// void A::foo() volatile { bar();/*2*/ }
850
// void A::foo() const { bar();/*3*/ }
851
// void A::foo() { bar();/*4*/ }
856
// const volatile A cva;
862
public void testMemberFunctionDisambiguationByCVness_238409() throws Exception {
863
ICPPMethod bar_cv= getBindingFromASTName("bar();/*1*/", 3, ICPPMethod.class);
864
ICPPMethod bar_v= getBindingFromASTName("bar();/*2*/", 3, ICPPMethod.class);
865
ICPPMethod bar_c= getBindingFromASTName("bar();/*3*/", 3, ICPPMethod.class);
866
ICPPMethod bar= getBindingFromASTName("bar();/*4*/", 3, ICPPMethod.class);
867
ICPPFunctionType bar_cv_ft= bar_cv.getType();
868
ICPPFunctionType bar_v_ft= bar_v.getType();
869
ICPPFunctionType bar_c_ft= bar_c.getType();
870
ICPPFunctionType bar_ft= bar.getType();
872
assertTrue(bar_cv_ft.isConst()); assertTrue(bar_cv_ft.isVolatile());
873
assertTrue(!bar_v_ft.isConst()); assertTrue(bar_v_ft.isVolatile());
874
assertTrue(bar_c_ft.isConst()); assertTrue(!bar_c_ft.isVolatile());
875
assertTrue(!bar_ft.isConst()); assertTrue(!bar_ft.isVolatile());
877
bar_cv= getBindingFromASTName("bar();/*5*/", 3, ICPPMethod.class);
878
bar_v= getBindingFromASTName("bar();/*6*/", 3, ICPPMethod.class);
879
bar_c= getBindingFromASTName("bar();/*7*/", 3, ICPPMethod.class);
880
bar= getBindingFromASTName("bar();/*8*/", 3, ICPPMethod.class);
881
bar_cv_ft= bar_cv.getType();
882
bar_v_ft= bar_v.getType();
883
bar_c_ft= bar_c.getType();
884
bar_ft= bar.getType();
886
assertTrue(bar_cv_ft.isConst()); assertTrue(bar_cv_ft.isVolatile());
887
assertTrue(!bar_v_ft.isConst()); assertTrue(bar_v_ft.isVolatile());
888
assertTrue(bar_c_ft.isConst()); assertTrue(!bar_c_ft.isVolatile());
889
assertTrue(!bar_ft.isConst()); assertTrue(!bar_ft.isVolatile());
892
// typedef char t[12];
893
// void test1(char *);
894
// void test2(char []);
900
// test2(x); // problem binding here
901
// test3(x); // problem binding here
903
public void testAdjustmentOfParameterTypes_Bug239975() throws Exception {
904
getBindingFromASTName("test1(x)", 5, ICPPFunction.class);
905
getBindingFromASTName("test2(x)", 5, ICPPFunction.class);
906
getBindingFromASTName("test3(x)", 5, ICPPFunction.class);
927
// template<typename T> class CT : B {
933
// template<> class CT<char> : A {
939
// template<typename S> class Container {
946
// template<typename T> class CT : B {
953
// template<> class Container<char>::C : A {
959
// template<> template<typename T> class Container<char>::CT : A {
969
// Container<int>::C spec;
970
// Container<int>::CT<int> spect;
971
// Container<char>::C espec;
972
// Container<char>::CT<int> espect;
973
public void testClassTypes_Bug98171() throws Exception {
975
ICPPClassType ct= getBindingFromASTName("C", 1);
976
assertBindings(new String[] {"B"}, ct.getBases());
977
assertBindings(new String[] {"n", "m", "B", "C"}, ct.getAllDeclaredMethods());
978
assertBindings(new String[] {"C", "C"}, ct.getConstructors());
979
assertBindings(new String[] {"g"}, ct.getDeclaredFields());
980
assertBindings(new String[] {"n", "C"}, ct.getDeclaredMethods());
981
assertBindings(new String[] {"f", "g"}, ct.getFields());
982
assertBindings(new String[] {"m", "n", "C", "C", "~C", "B", "B", "~B", "operator =", "operator ="}, ct.getMethods());
983
assertBindings(new String[] {"O"}, ct.getNestedClasses());
986
ct= getBindingFromASTName("CT<int>", 2);
987
assertInstance(ct, ICPPClassTemplate.class);
988
assertBindings(new String[] {"B"}, ct.getBases());
989
assertBindings(new String[] {"n", "m", "B", "CT"}, ct.getAllDeclaredMethods());
990
assertBindings(new String[] {"CT", "CT"}, ct.getConstructors());
991
assertBindings(new String[] {"g"}, ct.getDeclaredFields());
992
assertBindings(new String[] {"n", "CT"}, ct.getDeclaredMethods());
993
assertBindings(new String[] {"f", "g"}, ct.getFields());
994
assertBindings(new String[] {"m", "n", "CT", "CT", "~CT", "B", "B", "~B", "operator =", "operator ="}, ct.getMethods());
995
assertBindings(new String[] {"O"}, ct.getNestedClasses());
997
// class template instance
998
ct= getBindingFromASTName("CT<int>", 7);
999
assertInstance(ct, ICPPTemplateInstance.class);
1000
assertBindings(new String[] {"B"}, ct.getBases());
1001
assertBindings(new String[] {"n", "m", "B", "CT"}, ct.getAllDeclaredMethods());
1002
assertBindings(new String[] {"CT", "CT"}, ct.getConstructors());
1003
assertBindings(new String[] {"g"}, ct.getDeclaredFields());
1004
assertBindings(new String[] {"n", "CT"}, ct.getDeclaredMethods());
1005
assertBindings(new String[] {"f", "g"}, ct.getFields());
1006
assertBindings(new String[] {"m", "n", "CT", "CT", "~CT", "B", "B", "~B", "operator =", "operator ="}, ct.getMethods());
1007
assertBindings(new String[] {"O"}, ct.getNestedClasses());
1009
// explicit class template instance
1010
ct= getBindingFromASTName("CT<char>", 8);
1011
assertInstance(ct, ICPPTemplateInstance.class);
1012
assertBindings(new String[] {"A"}, ct.getBases());
1013
assertBindings(new String[] {"o", "l", "A", "CT", "CT"}, ct.getAllDeclaredMethods());
1014
assertBindings(new String[] {"CT", "CT", "CT"}, ct.getConstructors());
1015
assertBindings(new String[] {"h"}, ct.getDeclaredFields());
1016
assertBindings(new String[] {"o", "CT", "CT"}, ct.getDeclaredMethods());
1017
assertBindings(new String[] {"e", "h"}, ct.getFields());
1018
assertBindings(new String[] {"l", "o", "CT", "CT", "CT", "~CT", "A", "A", "~A", "operator =", "operator ="}, ct.getMethods());
1019
assertBindings(new String[] {"P"}, ct.getNestedClasses());
1021
// class specialization
1022
ct= getBindingFromASTName("C spec", 1);
1023
assertInstance(ct, ICPPClassSpecialization.class);
1024
assertBindings(new String[] {"B"}, ct.getBases());
1025
assertBindings(new String[] {"n", "m", "B", "C"}, ct.getAllDeclaredMethods());
1026
assertBindings(new String[] {"C", "C"}, ct.getConstructors());
1027
assertBindings(new String[] {"g"}, ct.getDeclaredFields());
1028
assertBindings(new String[] {"n", "C"}, ct.getDeclaredMethods());
1029
assertBindings(new String[] {"f", "g"}, ct.getFields());
1030
assertBindings(new String[] {"m", "n", "C", "C", "~C", "B", "B", "~B", "operator =", "operator ="}, ct.getMethods());
1031
assertBindings(new String[] {"O"}, ct.getNestedClasses());
1033
// class template specialization
1034
ct= getBindingFromASTName("CT<int> spect", 2);
1035
assertInstance(ct, ICPPClassTemplate.class, ICPPClassSpecialization.class);
1036
assertBindings(new String[] {"B"}, ct.getBases());
1037
assertBindings(new String[] {"n", "m", "B", "CT"}, ct.getAllDeclaredMethods());
1038
assertBindings(new String[] {"CT", "CT"}, ct.getConstructors());
1039
assertBindings(new String[] {"g"}, ct.getDeclaredFields());
1040
assertBindings(new String[] {"n", "CT"}, ct.getDeclaredMethods());
1041
assertBindings(new String[] {"f", "g"}, ct.getFields());
1042
assertBindings(new String[] {"m", "n", "CT", "CT", "~CT", "B", "B", "~B", "operator =", "operator ="}, ct.getMethods());
1043
assertBindings(new String[] {"O"}, ct.getNestedClasses());
1045
// explicit class specialization
1046
ct= getBindingFromASTName("C espec", 1);
1047
assertInstance(ct, ICPPClassSpecialization.class);
1048
assertBindings(new String[] {"A"}, ct.getBases());
1049
assertBindings(new String[] {"o", "l", "A", "C", "C"}, ct.getAllDeclaredMethods());
1050
assertBindings(new String[] {"C", "C", "C"}, ct.getConstructors());
1051
assertBindings(new String[] {"h"}, ct.getDeclaredFields());
1052
assertBindings(new String[] {"o", "C", "C"}, ct.getDeclaredMethods());
1053
assertBindings(new String[] {"e", "h"}, ct.getFields());
1054
assertBindings(new String[] {"l", "o", "C", "C", "C", "~C", "A", "A", "~A", "operator =", "operator ="}, ct.getMethods());
1055
assertBindings(new String[] {"P"}, ct.getNestedClasses());
1057
// explicit class template specialization
1058
ct= getBindingFromASTName("CT<int> espect", 7);
1059
assertInstance(ct, ICPPTemplateInstance.class);
1060
assertBindings(new String[] {"A"}, ct.getBases());
1061
assertBindings(new String[] {"o", "l", "A", "CT", "CT"}, ct.getAllDeclaredMethods());
1062
assertBindings(new String[] {"CT", "CT", "CT"}, ct.getConstructors());
1063
assertBindings(new String[] {"h"}, ct.getDeclaredFields());
1064
assertBindings(new String[] {"o", "CT", "CT"}, ct.getDeclaredMethods());
1065
assertBindings(new String[] {"e", "h"}, ct.getFields());
1066
assertBindings(new String[] {"l", "o", "CT", "CT", "CT", "~CT", "A", "A", "~A", "operator =", "operator ="}, ct.getMethods());
1067
assertBindings(new String[] {"P"}, ct.getNestedClasses());
1070
// void func(const int* x) {}
1072
// void func(int* p) {
1073
// const int* q = p;
1076
public void testOverloadedFunctionFromIndex_Bug256240() throws Exception {
1077
getBindingFromASTName("func(q", 4, ICPPFunction.class);
1087
// void A::B::m() {}
1088
public void testNestedClasses_Bug259683() throws Exception {
1089
getBindingFromASTName("A::B::m", 7, ICPPMethod.class);
1099
// template<typename T> operator T*(){return 0;};
1105
// a.operator S *();
1108
public void testLookupScopeForConversionNames_267221() throws Exception {
1109
getBindingFromASTName("operator S *", 12, ICPPMethod.class);
1112
private void assertBindings(String[] expected, ICPPBase[] bases) throws DOMException {
1113
IBinding[] bindings= new IBinding[bases.length];
1114
for (int i = 0; i < bindings.length; i++) {
1115
bindings[i]= bases[i].getBaseClass();
1117
assertBindings(expected, bindings);
1120
private void assertBindings(String[] expected, IBinding[] binding) {
1121
String[] actual= new String[binding.length];
1122
for (int i = 0; i < actual.length; i++) {
1123
actual[i]= binding[i].getName();
1125
Arrays.sort(actual);
1126
Arrays.sort(expected);
1127
assertEquals(toString(expected), toString(actual));
1130
private String toString(String[] actual) {
1131
StringBuilder buf= new StringBuilder();
1133
boolean isFirst= true;
1134
for (String val : actual) {
1142
return buf.toString();
1150
// void useBase(Base* b);
1152
// class Derived: Base {};
1157
public void testLateDefinitionOfInheritance_Bug292749() throws Exception {
1158
getBindingFromASTName("useBase(x.d", 7, ICPPFunction.class);
1164
// void fx(int, int);
1170
// #include "header.h"
1176
public void testUsingDeclaration_Bug300019() throws Exception {
1177
getBindingFromASTName("fx();", 2, ICPPFunction.class);
1178
getBindingFromASTName("fx(1);", 2, ICPPFunction.class);
1179
getBindingFromASTName("fx(1,1);", 2, ICPPFunction.class);
1182
// struct YetAnotherTest {
1184
// friend class InnerClass3;
1185
// class InnerClass3 {
1191
// InnerClass3 arr[32];
1195
// void YetAnotherTest::test() {
1198
public void testElaboratedTypeSpecifier_Bug303739() throws Exception {
1199
getBindingFromASTName("member=0", -2, ICPPField.class);
1202
// typedef int xxx::* MBR_PTR;
1207
public void testProblemInIndexBinding_Bug317146() throws Exception {
1208
ITypedef td= getBindingFromASTName("MBR_PTR", 0, ITypedef.class);
1209
ICPPPointerToMemberType ptrMbr= (ICPPPointerToMemberType) td.getType();
1210
IType t= ptrMbr.getMemberOfClass();
1211
assertInstance(t, ISemanticProblem.class);
1215
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1216
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1217
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1218
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1219
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1220
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1221
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1222
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1223
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1224
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1225
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1226
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1227
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1228
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1229
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1230
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
1232
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1233
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1234
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1235
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1236
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1237
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1238
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1239
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1240
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1241
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1242
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1243
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1244
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1245
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1246
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,
1247
// int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int);
1251
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1252
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1253
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1254
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1255
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1256
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1257
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1258
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
1260
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1261
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1262
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1263
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1264
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1265
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1266
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1267
// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
1269
public void testFunctionsWithManyParameters_Bug319186() throws Exception {
1270
getBindingFromASTName("f255", 0);
1271
getBindingFromASTName("f256", 0);
1274
// void f(char16_t x);
1275
// void f(char32_t x);
1282
public void testChar16_Bug319186() throws Exception {
1283
IFunction f= getBindingFromASTName("f(c16)", 1);
1284
assertEquals("char16_t", ASTTypeUtil.getType(f.getType().getParameterTypes()[0]));
1286
f= getBindingFromASTName("f(c32)", 1);
1287
assertEquals("char32_t", ASTTypeUtil.getType(f.getType().getParameterTypes()[0]));
1293
// typedef int Type;
1299
// #include "header.h"
1300
// using namespace ::ns;
1306
public void test_Bug326778() throws Exception {
1307
IVariable v= getBindingFromASTName("var", 0);
1308
IFunction f= getBindingFromASTName("fun", 0);
1309
ITypedef t= getBindingFromASTName("Type", 0);