blob: 5fedc936e13bec7b18e1a4341e710c5aca62a63f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2016 Symbian Software Systems 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:
* Andrew Ferguson (Symbian) - Initial implementation
* Markus Schorn (Wind River Systems)
* Sergey Prigogin (Google)
* Nathan Ridge
*******************************************************************************/
package org.eclipse.cdt.internal.index.tests;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
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.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
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.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTypeArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper.MethodKind;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
import org.eclipse.cdt.internal.core.index.IIndexScope;
import org.eclipse.core.runtime.CoreException;
import junit.framework.TestSuite;
/**
* Tests for exercising resolution of template bindings against IIndex
*/
public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBase {
public static class SingleProject extends IndexCPPTemplateResolutionTest {
public SingleProject() {setStrategy(new SinglePDOMTestStrategy(true));}
public static TestSuite suite() {return suite(SingleProject.class);}
}
public static class ProjectWithDepProj extends IndexCPPTemplateResolutionTest {
public ProjectWithDepProj() {setStrategy(new ReferencedProject(true));}
public static TestSuite suite() {return suite(ProjectWithDepProj.class);}
@Override
public void testDefaultTemplateArgInHeader_264988() throws Exception {
// Not supported across projects (the composite index does not merge
// default values of template parameters).
}
}
public static void addTests(TestSuite suite) {
suite.addTest(SingleProject.suite());
suite.addTest(ProjectWithDepProj.suite());
}
public IndexCPPTemplateResolutionTest() {
setStrategy(new SinglePDOMTestStrategy(true));
}
// template<typename _TpAllocator>
// struct Allocator {
// typedef _TpAllocator& alloc_reference;
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
// };
//
// template<typename _Tp, typename _Alloc = Allocator<_Tp> >
// struct Vec {
// typedef typename _Alloc::template rebind<_Tp>::other::alloc_reference reference;
// };
// void f(Vec<int>::reference r) {}
public void testRebindPattern_214017_1() throws Exception {
IBinding b0= getBindingFromASTName("r)", 1);
assertInstance(b0, ICPPVariable.class);
IType type = ((ICPPVariable) b0).getType();
type = SemanticUtil.getUltimateType(type, false);
assertInstance(type, IBasicType.class);
assertEquals("int", ASTTypeUtil.getType(type));
}
// template<typename _TpAllocator>
// struct Allocator {
// typedef _TpAllocator& alloc_reference;
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
// };
//
// template<typename _TpBase, typename _AllocBase>
// struct VecBase {
// typedef typename _AllocBase::template rebind<_TpBase>::other _Tp_alloc_type;
// };
//
// template<typename _Tp, typename _Alloc = Allocator<_Tp> >
// struct Vec : public VecBase<_Tp, _Alloc> {
// typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference;
// };
// void f(Vec<int>::reference r) {}
public void testRebindPattern_214017_2() throws Exception {
IBinding b0= getBindingFromASTName("r)", 1);
assertInstance(b0, ICPPVariable.class);
IType type = ((ICPPVariable) b0).getType();
type = SemanticUtil.getUltimateType(type, false);
assertInstance(type, IBasicType.class);
assertEquals("int", ASTTypeUtil.getType(type));
}
// template<typename _TpAllocatorForward>
// class Allocator;
//
// template<>
// struct Allocator<void> {
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
// };
//
// template<typename _TpAllocator>
// struct Allocator {
// typedef _TpAllocator& alloc_reference;
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
// };
//
// template<typename _TpBase, typename _AllocBase>
// struct VecBase {
// typedef typename _AllocBase::template rebind<_TpBase>::other _Tp_alloc_type;
// };
//
// template<typename _Tp, typename _Alloc = Allocator<_Tp> >
// struct Vec : public VecBase<_Tp, _Alloc> {
// typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference;
// };
// void f(Vec<int>::reference r) {}
public void testRebindPattern_214017_3() throws Exception {
IBinding b0= getBindingFromASTName("r)", 1);
assertInstance(b0, ICPPVariable.class);
IType type = ((ICPPVariable) b0).getType();
type = SemanticUtil.getUltimateType(type, false);
assertInstance(type, IBasicType.class);
assertEquals("int", ASTTypeUtil.getType(type));
}
// template<typename _TpAllocator>
// struct Allocator {
// typedef _TpAllocator& alloc_reference;
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
// };
//
// template<typename _TpBase, typename _AllocBase>
// struct VecBase {
// typedef typename _AllocBase::template rebind<_TpBase*>::other unreferenced;
// typedef typename _AllocBase::template rebind<_TpBase>::other _Tp_alloc_type;
// };
//
// template<typename _Tp, typename _Alloc = Allocator<_Tp> >
// struct Vec : public VecBase<_Tp, _Alloc> {
// typedef typename VecBase<_Tp, _Alloc>::_Tp_alloc_type::alloc_reference reference;
// };
// void f(int s);
//
// void test(Vec<int>::reference p) {
// f(p);
// }
public void testRebindPattern_276610() throws Exception {
getBindingFromASTName("f(p)", 1, ICPPFunction.class);
}
// class Str1 {
// public:
// Str1(const char* s) {
// s_ = s;
// }
//
// const char* s_;
// };
//
// template<typename T>
// class StrT {
// public:
// StrT(const T* s) {
// s_ = s;
// }
//
// const T* s_;
// };
//
// template<typename T>
// class C1 {
// public:
// void m1(const Str1& s) {}
// void m2(const StrT<T> s) {}
// };
// void main() {
// C1<char> c1;
// c1.m1("aaa"); // OK
// c1.m2("aaa"); // problem
// }
public void testUnindexedConstructorInstanceImplicitReferenceToDeferred() throws Exception {
IBinding b0= getBindingFromASTName("C1<char> c1", 8);
IBinding b1= getBindingFromASTName("m1(\"aaa\")", 2);
IBinding b2= getBindingFromASTName("m2(\"aaa\")", 2);
assertEquals(1, getIndex().findNames(b1, IIndex.FIND_REFERENCES).length);
assertEquals(1, getIndex().findNames(b2, IIndex.FIND_REFERENCES).length);
}
// template<typename T>
// class X {
// public: static void foo() {}
// };
// class A{};
// void bar() {
// X<A>::foo();
// }
public void testUnindexedMethodInstance() {
IBinding b0= getBindingFromASTName("foo()", 3);
assertInstance(b0, ICPPMethod.class);
}
// template<typename T>
// class StrT {
// public: void assign(const T* s) {}
// };
// void main() {
// StrT<char> x;
// x.assign("aaa");
// }
public void testUnindexedMethodInstance2() throws Exception {
IBinding b0= getBindingFromASTName("assign(\"aaa\")", 6);
assertInstance(b0, ICPPMethod.class);
assertEquals(1, getIndex().findNames(b0, IIndex.FIND_REFERENCES).length);
IParameter[] parameters = ((ICPPMethod) b0).getParameters();
IFunctionType type = ((ICPPMethod) b0).getType();
}
// template<typename T>
// class X {};
// class A{};
// void bar() {
// X<A> xa= new X<A>();
// }
public void testUnindexedConstructorInstance() {
IBinding b0= getBindingFromImplicitASTName("X<A>()", 4);
assertInstance(b0, ICPPConstructor.class);
}
// template<typename T>
// class StrT {
// public:
// StrT(const T* s) {
// s_ = s;
// }
//
// const T* s_;
// };
//
// template<typename T>
// class C1 {
// public:
// void m2(T t) {}
// };
// class A {};
// void foo() {
// C1< StrT<A> > c1a;
// c1a.m2(*new StrT<A>(new A()));
// }
public void testUnindexedConstructorInstanceImplicitReference3() throws Exception {
IBinding b0= getBindingFromASTName("C1< StrT<A> >", 2);
IBinding b1= getBindingFromASTName("StrT<A> > c1a", 7);
IBinding b2= getBindingFromASTName("StrT<A>(", 7);
IBinding b3= getBindingFromASTName("c1a;", 3);
IBinding b4= getBindingFromASTName("m2(*", 2);
}
// class Str1 {
// public:
// Str1(const char* s) {
// s_ = s;
// }
//
// const char* s_;
// };
//
// template<typename T>
// class StrT {
// public:
// StrT(const T* s) {
// s_ = s;
// }
//
// const T* s_;
// };
//
// typedef StrT<char> Str2;
//
// class C1 {
// public:
// void m1(const Str1& s) {}
// void m2(const Str2& s) {}
// void m3();
// };
// void C1::m3() {
// m1("aaa"); // OK
// m2("aaa"); // problem
// }
public void testUnindexedConstructorInstanceImplicitReference() throws Exception {
IBinding b0= getBindingFromASTName("m1(\"aaa\")", 2);
IBinding b1= getBindingFromASTName("m2(\"aaa\")", 2);
assertEquals(1, getIndex().findNames(b0, IIndex.FIND_REFERENCES).length);
assertEquals(1, getIndex().findNames(b1, IIndex.FIND_REFERENCES).length);
}
// // Bryan W.'s example from bugzilla#167098
// template<class K>
// class D { //CPPClassTemplate
// public:
// template<class T, class X>
// D(T t, X x) {} // CPPConstructorTemplate
//
// template<class T, class X>
// void foo(T t, X x) {} // CPPMethodTemplate
// };
// void bar() {
// D<int> *var = new D<int>(5, 6);
// // First D<int>: CPPClassInstance
// // Second D<int>: CPPConstructorInstance
// // Now, getting the instance's specialized binding should
// // result in a CPPConstructorTemplateSpecialization
// var->foo<int,int>(7, 8);
// // foo -> CPPMethodTemplateSpecialization
// // foo<int,int> -> CPPMethodInstance
// }
public void testCPPConstructorTemplateSpecialization() throws Exception {
IBinding b0= getBindingFromASTName("D<int> *var", 1);
IBinding b1= getBindingFromASTName("D<int> *var", 6);
assertInstance(b0, ICPPClassTemplate.class);
assertInstance(b0, ICPPClassType.class);
assertInstance(b1, ICPPTemplateInstance.class);
assertInstance(b1, ICPPClassType.class);
// ICPPClassType _ct= (ICPPClassType) b1;
// ICPPConstructor[] _ctcs= _ct.getConstructors();
// assertEquals(3, _ctcs.length); // two implicit plus the constructor template
IBinding b2= getBindingFromASTName("D<int>(", 1);
IBinding b3= getBindingFromImplicitASTName("D<int>(", 6);
assertInstance(b2, ICPPClassTemplate.class); // *D*<int>(5, 6)
assertInstance(b2, ICPPClassType.class); // *D*<int>(5, 6)
assertInstance(b3, ICPPTemplateInstance.class); // *D<int>*(5, 6)
assertInstance(b3, ICPPConstructor.class); // *D<int>*(5, 6)
//
// ICPPClassType ct= (ICPPClassType) b2;
// ICPPConstructor[] ctcs= ct.getConstructors();
// assertEquals(3, ctcs.length); // two implicit plus the constructor template
IBinding tidSpc= ((ICPPTemplateInstance)b3).getSpecializedBinding();
assertInstance(tidSpc, ICPPConstructor.class);
assertInstance(tidSpc, ICPPSpecialization.class);
assertInstance(tidSpc, ICPPFunctionTemplate.class);
}
// class B {};
//
// template<typename T>
// class A {
// public:
// T (*f)(int x);
// };
//
// template<typename T> T foo(int x) {return *new T();}
// template<typename T> T foo(int x, int y) {return *new T();}
// void qux() {
// A<B> a;
// a.f= foo<B>;
// }
public void testOverloadedFunctionTemplate() {
IBinding b0= getBindingFromASTName("foo<B>;", 6);
assertInstance(b0, ICPPFunction.class);
assertInstance(b0, ICPPSpecialization.class);
}
// template <typename T, int N>
// char (&f(T (&a)[N]))[N];
//
// template <typename T, int N>
// char (&f(const T (&a)[N]))[N];
//
// struct C { static const char c[]; };
// const char C::c[] = "";
// int x = sizeof(f(C::c));
public void testOverloadedFunctionTemplate_407579() throws Exception {
checkBindings();
}
// template<class T>
// struct A {
// typedef T t;
// };
// template<typename T>
// struct B {};
//
// typedef B<int> C;
//
// template <typename T>
// struct D {
// typedef A<const T> t2;
// };
//
// template <typename U>
// void waldo(const U& a, typename U::t2::t& b);
// template <typename U>
// void waldo(U& a, typename U::t2::t& b);
//
// void test() {
// typedef A<C> E;
// D<E> x;
// E y;
// waldo(x, y);
// }
public void testOverloadedFunctionTemplate_429624() throws Exception {
checkBindings();
}
// template<typename T, template<typename U> class S>
// class Foo {
// public:
// S<T> s;
// };
//
// template<typename Z> class X {
// public:
// void foo(Z z) {}
// };
//
// class A {};
// void qux() {
// Foo<A,X> f;
// f.s.foo(*new A());
// }
public void testTemplateTemplateParameter() throws Exception {
IBinding b0= getBindingFromASTName("Foo<A,X>", 3);
IBinding b1= getBindingFromASTName("Foo<A,X>", 8);
IBinding b2= getBindingFromASTName("f.s.foo", 1);
IBinding b3= getBindingFromASTName("s.foo", 1);
IBinding b4= getBindingFromASTName("foo(*", 3);
assertInstance(b0, ICPPClassTemplate.class);
assertInstance(b0, ICPPClassType.class);
ICPPTemplateParameter[] ps= ((ICPPClassTemplate)b0).getTemplateParameters();
assertEquals(2, ps.length);
assertInstance(ps[0], ICPPTemplateTypeParameter.class);
assertInstance(ps[1], ICPPTemplateTemplateParameter.class);
assertInstance(b1, ICPPTemplateInstance.class);
assertInstance(b1, ICPPClassType.class);
ICPPTemplateArgument[] args= ((ICPPTemplateInstance) b1).getTemplateArguments();
assertInstance(args[0].getTypeValue(), ICPPClassType.class);
assertInstance(args[1].getTypeValue(), ICPPClassTemplate.class);
assertInstance(args[1].getTypeValue(), ICPPClassType.class);
ICPPTemplateParameterMap om= ((ICPPTemplateInstance) b1).getTemplateParameterMap();
assertEquals(2, om.getAllParameterPositions().length);
assertInstance(om.getArgument(0).getTypeValue(), ICPPClassType.class);
assertInstance(om.getArgument(1).getTypeValue(), ICPPClassType.class);
assertInstance(om.getArgument(1).getTypeValue(), ICPPClassTemplate.class);
IBinding b1_spcd= ((ICPPTemplateInstance) b1).getSpecializedBinding();
assertInstance(b1_spcd, ICPPClassTemplate.class);
assertInstance(b1_spcd, ICPPClassType.class);
assertTrue(((IType)b1_spcd).isSameType((IType)b0));
}
// template<typename T1, typename T2>
// class Foo {
// public:
// T1* foo (T2 t) {
// return 0;
// }
// };
//
// class A {};
// class B {};
//
// class X : public Foo<A,B> {};
// class Y : public Foo<B,A> {};
//
// class AA {};
// class BB {};
//
// class Z : public Foo<AA,BB> {};
//
// X x;
// Y y;
// Z z;
public void testInstanceInheritance() throws Exception {
IBinding[] bs= {
getBindingFromASTName("X x;", 1),
getBindingFromASTName("Y y;", 1),
getBindingFromASTName("Z z;", 1)
};
for (IBinding b : bs) {
assertInstance(b, ICPPClassType.class);
ICPPClassType c= (ICPPClassType) b;
assertEquals(1, c.getBases().length);
ICPPClassType xb= (ICPPClassType) c.getBases()[0].getBaseClass();
assertInstance(xb, ICPPTemplateInstance.class);
ICPPTemplateParameter[] templateParameters =
((ICPPTemplateInstance) xb).getTemplateDefinition().getTemplateParameters();
assertInstance(templateParameters[0], ICPPTemplateTypeParameter.class);
assertInstance(templateParameters[1], ICPPTemplateTypeParameter.class);
ICPPTemplateParameterMap args= ((ICPPTemplateInstance) xb).getTemplateParameterMap();
assertInstance(args.getArgument(0).getTypeValue(), ICPPClassType.class);
assertInstance(args.getArgument(1).getTypeValue(), ICPPClassType.class);
}
}
// namespace ns {
// template<typename T1>
// struct A {
// static int a;
// };
// }
//
// template<typename T2>
// struct B : public ns::A<T2> {};
// void test() {
// B<int>::a;
// }
public void testInstanceInheritance_258745() throws Exception {
getBindingFromFirstIdentifier("a", ICPPField.class);
}
// template <typename>
// struct Base {
// virtual void foo() = 0;
// };
//
// struct Derived : Base<int> {
// virtual void foo();
// };
// Derived waldo;
public void testMethodOveriddenFromTemplateInstanceBase_480892() throws Exception {
IVariable waldo = getBindingFromFirstIdentifier("waldo");
IType derived = waldo.getType();
assertInstance(derived, ICPPClassType.class);
ICPPClassType derivedClass = (ICPPClassType) derived;
ICPPMethod[] pureVirtualMethods = SemanticQueries.getPureVirtualMethods(derivedClass, null);
assertEquals(0, pureVirtualMethods.length);
}
// class A {}; class B {}; class C {};
// template<typename T1, typename T2>
// class D {};
//
// template<typename T3>
// class D<A, T3> {};
// template<typename T3> class D<A, T3>; // harmless declaration for test purposes
// template<typename T3> class D<B, T3> {};
// template<typename T3> class D<C, T3> {};
public void testClassPartialSpecializations() throws Exception {
IBinding b0= getBindingFromASTName("D<A, T3>", 8);
IBinding b1= getBindingFromASTName("D<B, T3>", 8);
IBinding b2= getBindingFromASTName("D<C, T3>", 8);
IBinding b3= getBindingFromASTName("D<B", 1);
List spBindings= new ArrayList();
assertInstance(b0, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization) b0).getPrimaryClassTemplate());
assertInstance(b1, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization) b1).getPrimaryClassTemplate());
assertInstance(b2, ICPPClassTemplatePartialSpecialization.class);
spBindings.add(((ICPPClassTemplatePartialSpecialization) b2).getPrimaryClassTemplate());
for (int i= 0; i < spBindings.size(); i++) {
for (int j= 0; j < spBindings.size(); j++) {
IType ty1= (IType) spBindings.get(i);
IType ty2= (IType) spBindings.get(j);
assertTrue(ty1.isSameType(ty2));
}
}
assertInstance(b3, ICPPClassTemplate.class);
ICPPClassTemplate ct= (ICPPClassTemplate) b3;
assertEquals(3, ct.getPartialSpecializations().length);
}
// template<typename T1>
// class A {};
//
// template<typename T2>
// class B : public A<T2> {
// public:
// static void foo() {}
// };
//
// B<int> bb; // make sure the instance is in the pdom
// template<typename T3>
// class X : public B<T3> {};
//
// void qux() {
// B<int>::foo();
// B<long>::foo(); // instance not in the referenced pdom
// X<int> x;
// }
public void testClassImplicitInstantiations_188274() throws Exception {
IBinding b2= getBindingFromASTName("X<int>", 6);
assertInstance(b2, ICPPClassType.class);
assertInstance(b2, ICPPTemplateInstance.class);
ICPPClassType ct2= (ICPPClassType) b2;
ICPPBase[] bss2= ct2.getBases();
assertEquals(1, bss2.length);
assertInstance(bss2[0].getBaseClass(), ICPPClassType.class);
ICPPClassType ct2b= (ICPPClassType) bss2[0].getBaseClass();
assertInstance(ct2b, ICPPTemplateInstance.class);
IBinding b0= getBindingFromASTName("B<int>", 6);
assertInstance(b0, ICPPClassType.class);
ICPPClassType ct= (ICPPClassType) b0;
ICPPBase[] bss= ct.getBases();
assertEquals(1, bss.length);
assertInstance(bss[0].getBaseClass(), ICPPClassType.class);
IBinding b1= getBindingFromASTName("B<long>", 7);
assertInstance(b1, ICPPClassType.class);
ICPPClassType ct1= (ICPPClassType) b1;
ICPPBase[] bss1= ct1.getBases();
assertEquals(1, bss1.length);
assertInstance(bss1[0].getBaseClass(), ICPPClassType.class);
}
// class B {};
//
// template<typename T>
// class A {
// T t;
// T foo(T t) { return t; }
// void bar(T t, int& x) {}
// };
//
// template<>
// class A<B> {
// B t;
// int x;
// B foo(B t) { B x= *new B(); return x; }
// void bar(B t, int& x) { x++; }
// };
// A<B> ab;
public void testClassSpecializationMethods() throws Exception {
IBinding b0= getBindingFromASTName("A<B> ab", 4);
assertInstance(b0, ICPPClassType.class);
assertInstance(b0, ICPPSpecialization.class);
ICPPClassType ct= (ICPPClassType) b0;
ICPPMethod[] dms= ct.getDeclaredMethods();
assertEquals(2, dms.length);
// if the specialization was used, we have 2 fields.
ICPPField[] fs= ct.getDeclaredFields();
assertEquals(2, fs.length);
ICPPMethod foo= dms[0].getName().equals("foo") ? dms[0] : dms[1];
ICPPMethod bar= dms[0].getName().equals("bar") ? dms[0] : dms[1];
assertEquals(foo.getName(), "foo");
assertEquals(bar.getName(), "bar");
assertInstance(foo.getType().getReturnType(), ICPPClassType.class);
assertEquals(((ICPPClassType)foo.getType().getReturnType()).getName(), "B");
assertEquals(foo.getType().getParameterTypes().length, 1);
assertInstance(foo.getType().getParameterTypes()[0], ICPPClassType.class);
assertEquals(((ICPPClassType)foo.getType().getParameterTypes()[0]).getName(), "B");
assertInstance(bar.getType().getReturnType(), ICPPBasicType.class);
assertEquals(((ICPPBasicType)bar.getType().getReturnType()).getType(), IBasicType.t_void);
}
// template<class T>
// auto trailing_return_type(T& p) -> decltype(p.m());
// template<typename T>
// struct A {
// typedef T type;
// };
//
// template<typename T>
// typename A<T>::type declval();
//
// template<class T>
// class B {};
//
// template <typename T>
// using C = decltype(trailing_return_type(declval<T&>()));
//
// template <typename T>
// B<C<T>> waldo(T& q);
//
// template<typename T>
// struct D {
// T* m();
// };
//
// D<int> b;
//
// void test() {
// waldo(b);
// }
public void testTrailingReturnType_460183() throws Exception {
checkBindings();
}
// template<typename T> class A {
// public:
// typedef T TD;
// };
//
// class B {};
// A<B>::TD foo;
// class C {};
// A<C>::TD bar;
//
// void qux() {
// A<B>::TD foo2= foo;
// A<C>::TD bar2= bar;
// }
public void testTypedefSpecialization() {
IBinding b0= getBindingFromASTName("TD foo2", 2);
IBinding b1= getBindingFromASTName("TD bar2", 2);
assertInstance(b0, ITypedef.class);
assertInstance(b1, ITypedef.class);
assertInstance(b0, ICPPSpecialization.class);
assertInstance(b1, ICPPSpecialization.class);
ICPPTemplateParameterMap om0= ((ICPPSpecialization) b0).getTemplateParameterMap();
ICPPTemplateParameterMap om1= ((ICPPSpecialization) b1).getTemplateParameterMap();
assertEquals(1, om0.getAllParameterPositions().length);
assertEquals(1, om1.getAllParameterPositions().length);
assertInstance(om0.getArgument(0).getTypeValue(), ICPPClassType.class);
assertInstance(om1.getArgument(0).getTypeValue(), ICPPClassType.class);
assertEquals("B", ((ICPPClassType) om0.getArgument(0).getTypeValue()).getName());
assertEquals("C", ((ICPPClassType) om1.getArgument(0).getTypeValue()).getName());
}
// template<typename T>
// class C {
// public:
// typedef T value_type;
// void m(value_type v) {}
// };
// void main() {
// C<int> x;
// x.m(1);
// }
public void testTypedefSpecialization_213861() throws Exception {
IBinding b0= getBindingFromASTName("m(1)", 1);
assertInstance(b0, ICPPMethod.class);
}
// template<typename X>
// void foo(X x) {}
//
// template<typename A, typename B>
// void foo(A a, B b) {}
//
// class C1 {}; class C2 {}; class C3 {};
// void bar() {
// foo<C1>(*new C1());
// foo<C2>(*new C2());
// foo<C3>(*new C3());
// foo<C1,C2>(*new C1(), *new C2());
// foo<C2,C3>(*new C2(), *new C3());
// foo<C3,C1>(*new C3(), *new C1());
// foo<C2,C1>(*new C2(), *new C1());
// foo<C3,C2>(*new C3(), *new C2());
// foo<C1,C3>(*new C1(), *new C3());
// }
public void testFunctionTemplateSpecializations() throws Exception {
IBinding b0= getBindingFromASTName("foo<C1>(", 3);
IBinding b1= getBindingFromASTName("foo<C2>(", 3);
IBinding b2= getBindingFromASTName("foo<C3>(", 3);
IBinding b3= getBindingFromASTName("foo<C1,C2>(", 3);
IBinding b4= getBindingFromASTName("foo<C2,C3>(", 3);
IBinding b5= getBindingFromASTName("foo<C3,C1>(", 3);
IBinding b6= getBindingFromASTName("foo<C2,C1>(", 3);
IBinding b7= getBindingFromASTName("foo<C3,C2>(", 3);
IBinding b8= getBindingFromASTName("foo<C1,C3>(", 3);
}
// class A {}; class B{}; class C {};
//
// template<typename T1, typename T2>
// void foo(T1 t1, T2 t2) {} // (0)
//
// template<>
// void foo(C c, A a) {} // (1)
// void bar() {
// A a;
// B b;
// C c;
// foo(a,b); // function instance of function template (0)
// foo(c,a); // function specialization (1)
// }
public void testFunctionInstanceSpecializationsParameters() throws Exception {
IBinding b0= getBindingFromASTName("foo(a,b)", 3);
assertInstance(b0, ICPPFunction.class);
assertInstance(b0, ICPPTemplateInstance.class);
ICPPFunctionType b0type= ((ICPPFunction) b0).getType();
assertInstance(b0type.getReturnType(), ICPPBasicType.class);
IType[] b0_ptypes= b0type.getParameterTypes();
assertEquals(2, b0_ptypes.length);
assertInstance(b0_ptypes[0], ICPPClassType.class);
assertInstance(b0_ptypes[1], ICPPClassType.class);
assertEquals("A", ((ICPPClassType) b0_ptypes[0]).getName());
assertEquals("B", ((ICPPClassType) b0_ptypes[1]).getName());
IParameter[] b0_pms= ((ICPPFunction) b0).getParameters();
assertEquals(2, b0_pms.length);
assertInstance(b0_pms[0].getType(), ICPPClassType.class);
assertInstance(b0_pms[1].getType(), ICPPClassType.class);
assertEquals("A", ((ICPPClassType) b0_pms[0].getType()).getName());
assertEquals("B", ((ICPPClassType) b0_pms[1].getType()).getName());
IBinding b0_spcd= ((ICPPTemplateInstance) b0).getSpecializedBinding();
assertInstance(b0_spcd, ICPPFunction.class);
assertInstance(b0_spcd, ICPPTemplateDefinition.class);
IParameter[] b0_spcd_pms= ((ICPPFunction)b0_spcd).getParameters();
assertEquals(2, b0_spcd_pms.length);
assertInstance(b0_spcd_pms[0].getType(), ICPPTemplateTypeParameter.class);
assertInstance(b0_spcd_pms[1].getType(), ICPPTemplateTypeParameter.class);
assertEquals("T1", ((ICPPTemplateTypeParameter) b0_spcd_pms[0].getType()).getName());
assertEquals("T2", ((ICPPTemplateTypeParameter) b0_spcd_pms[1].getType()).getName());
ICPPTemplateParameterMap b0_am= ((ICPPSpecialization)b0).getTemplateParameterMap();
assertEquals(2, b0_am.getAllParameterPositions().length);
assertInstance(b0_am.getArgument(0).getTypeValue(), ICPPClassType.class);
assertInstance(b0_am.getArgument(1).getTypeValue(), ICPPClassType.class);
assertEquals("A", ((ICPPClassType) b0_am.getArgument(0).getTypeValue()).getName());
assertEquals("B", ((ICPPClassType) b0_am.getArgument(1).getTypeValue()).getName());
ICPPFunctionType b0_spcd_type= ((ICPPFunction) b0_spcd).getType();
assertInstance(b0_spcd_type.getReturnType(), ICPPBasicType.class);
IType[] b0_spcd_ptypes= b0_spcd_type.getParameterTypes();
assertEquals(2, b0_spcd_ptypes.length);
assertInstance(b0_spcd_ptypes[0], ICPPTemplateTypeParameter.class);
assertInstance(b0_spcd_ptypes[1], ICPPTemplateTypeParameter.class);
assertEquals("T1", ((ICPPTemplateTypeParameter) b0_spcd_ptypes[0]).getName());
assertEquals("T2", ((ICPPTemplateTypeParameter) b0_spcd_ptypes[1]).getName());
IBinding b1= getBindingFromASTName("foo(c,a)", 3);
assertInstance(b1, ICPPFunction.class);
ICPPFunctionType b1type= ((ICPPFunction) b1).getType();
assertInstance(b1type.getReturnType(), ICPPBasicType.class);
IType[] b1_ptypes= b1type.getParameterTypes();
assertEquals(2, b1_ptypes.length);
assertInstance(b1_ptypes[0], ICPPClassType.class);
assertInstance(b1_ptypes[1], ICPPClassType.class);
assertEquals("C", ((ICPPClassType) b1_ptypes[0]).getName());
assertEquals("A", ((ICPPClassType) b1_ptypes[1]).getName());
IParameter[] b1_pms= ((ICPPFunction)b1).getParameters();
assertEquals(2, b1_pms.length);
assertInstance(b1_pms[0].getType(), ICPPClassType.class);
assertInstance(b1_pms[1].getType(), ICPPClassType.class);
assertEquals("C", ((ICPPClassType) b1_pms[0].getType()).getName());
assertEquals("A", ((ICPPClassType) b1_pms[1].getType()).getName());
assertInstance(b1, ICPPSpecialization.class);
ICPPSpecialization b1s= (ICPPSpecialization) b1;
IBinding b1_spcd= b1s.getSpecializedBinding();
assertInstance(b1_spcd, ICPPFunction.class);
assertInstance(b1_spcd, ICPPTemplateDefinition.class);
ICPPFunctionType b1_spcd_type= ((ICPPFunction) b1_spcd).getType();
assertInstance(b1_spcd_type.getReturnType(), ICPPBasicType.class);
IType[] b1_spcd_ptypes= b1_spcd_type.getParameterTypes();
assertEquals(2, b1_spcd_ptypes.length);
assertInstance(b1_spcd_ptypes[0], ICPPTemplateTypeParameter.class);
assertInstance(b1_spcd_ptypes[1], ICPPTemplateTypeParameter.class);
assertEquals("T1", ((ICPPTemplateTypeParameter) b1_spcd_ptypes[0]).getName());
assertEquals("T2", ((ICPPTemplateTypeParameter) b1_spcd_ptypes[1]).getName());
IParameter[] b1_spcd_pms= ((ICPPFunction)b1_spcd).getParameters();
assertEquals(2, b1_spcd_pms.length);
assertInstance(b1_spcd_pms[0].getType(), ICPPTemplateTypeParameter.class);
assertInstance(b1_spcd_pms[1].getType(), ICPPTemplateTypeParameter.class);
assertEquals("T1", ((ICPPTemplateTypeParameter) b1_spcd_pms[0].getType()).getName());
assertEquals("T2", ((ICPPTemplateTypeParameter) b1_spcd_pms[1].getType()).getName());
ICPPTemplateParameterMap b1_am= b1s.getTemplateParameterMap();
assertEquals(2, b1_am.getAllParameterPositions().length);
assertInstance(b1_am.getArgument(0).getTypeValue(), ICPPClassType.class);
assertInstance(b1_am.getArgument(1).getTypeValue(), ICPPClassType.class);
assertEquals("C", ((ICPPClassType)b1_am.getArgument(0).getTypeValue()).getName());
assertEquals("A", ((ICPPClassType)b1_am.getArgument(1).getTypeValue()).getName());
}
// class A {};
//
// template<typename T>
// void foo(T t) {}
// void bar() {
// A a;
// foo(a);
// }
public void testFunctionInstanceParameters() throws Exception {
IBinding b0= getBindingFromFirstIdentifier("foo(a)");
assertInstance(b0, ICPPTemplateInstance.class);
assertInstance(b0, ICPPFunction.class);
ICPPFunction f= (ICPPFunction) b0;
ICPPFunctionType type= f.getType();
IType rt= type.getReturnType();
IType[] pts= type.getParameterTypes();
IParameter[] ps= f.getParameters();
assertEquals(1, ps.length);
ICPPParameter param= (ICPPParameter) ps[0];
assertInstance(param, ICPPSpecialization.class);
IType paramType= param.getType();
assertInstance(paramType, ICPPClassType.class);
ICPPParameter paramSpec= (ICPPParameter) ((ICPPSpecialization) param).getSpecializedBinding();
assertInstance(paramSpec.getType(), ICPPTemplateTypeParameter.class);
ICPPTemplateTypeParameter ttp= (ICPPTemplateTypeParameter) paramSpec.getType();
assertEquals("T", ttp.getName());
assertNull(ttp.getDefault());
ICPPTemplateInstance inst= (ICPPTemplateInstance) b0;
IBinding sp= inst.getSpecializedBinding();
assertInstance(sp, ICPPFunction.class);
assertInstance(sp, ICPPTemplateDefinition.class);
}
// template <class T1, class T2, class R>
// void func(T1* obj, R (T2::*member)()) {
// }
//
// struct A {
// void m();
// };
// void test() {
// A a;
// func(&a, &A::m);
// }
public void testFunctionTemplate_245030() throws Exception {
ICPPFunction f= getBindingFromFirstIdentifier("func(&a, &A::m)");
assertInstance(f, ICPPTemplateInstance.class);
}
// template <class U>
// void func(const U& u, const typename U::t& v) {
// }
//
// template <class U>
// void func(U& u, const typename U::t& v) {
// }
// template <typename T>
// struct A {
// typedef T t;
// };
//
// void test(const A<int>& a, int b) {
// func(a, b);
// }
public void testFunctionTemplate_319498() throws Exception {
ICPPFunction f= getBindingFromFirstIdentifier("func(a, b)");
assertInstance(f, ICPPTemplateInstance.class);
}
// template <typename T>
// bool waldo(T* dummy = nullptr);
// struct A {};
//
// void test() {
// typedef A a;
// waldo<a>();
// }
public void testFunctionTemplateWithTypedef_431945() throws Exception {
checkBindings();
}
// template<typename T>
// class Foo {};
//
// class B {};
//
// template<>
// class Foo<B> {};
// Foo<B> b1;
//
// class A {};
//
// template<>
// class Foo<A> {};
//
// Foo<B> b2;
public void testClassSpecializations_180738() {
IBinding b1a = getBindingFromASTName("Foo<B> b1;", 3);
IBinding b1b = getBindingFromASTName("Foo<B> b1;", 6);
assertInstance(b1a, ICPPClassType.class);
assertInstance(b1a, ICPPClassTemplate.class);
assertInstance(b1b, ICPPClassType.class);
assertInstance(b1b, ICPPSpecialization.class);
ICPPSpecialization b1spc= (ICPPSpecialization) b1b;
ICPPTemplateParameterMap b1om= b1spc.getTemplateParameterMap();
assertEquals(1, b1om.getAllParameterPositions().length);
assertInstance(b1om.getArgument(0).getTypeValue(), ICPPClassType.class);
ICPPClassType b1pct= (ICPPClassType) b1om.getArgument(0).getTypeValue();
assertEquals("B", b1pct.getName());
IBinding b2a = getBindingFromASTName("Foo<B> b2;", 3);
IBinding b2b = getBindingFromASTName("Foo<B> b2;", 6);
assertInstance(b2a, ICPPClassType.class);
assertInstance(b2a, ICPPClassTemplate.class);
assertInstance(b2b, ICPPClassType.class);
assertInstance(b2b, ICPPSpecialization.class);
ICPPSpecialization b2spc= (ICPPSpecialization) b2b;
ICPPTemplateParameterMap b2om= b2spc.getTemplateParameterMap();
assertEquals(1, b2om.getAllParameterPositions().length);
assertInstance(b2om.getArgument(0).getTypeValue(), ICPPClassType.class);
ICPPClassType b2pct= (ICPPClassType) b2om.getArgument(0).getTypeValue();
assertEquals("B", b2pct.getName());
}
// // header file
// template <class T>
// T left(T a, T b) {
// return a;
// }
// void sanity() {}
// int d;
// void foo() { sanity(); }
// class Int {};
// Int a,b;
// Int c= left(a,b);
// Int c= left(a,d);
public void testSimpleFunctionTemplate() {
IBinding b0 = getBindingFromASTName("sanity();", 6);
IBinding b1 = getBindingFromASTName("a,b;", 1);
IBinding b2 = getBindingFromASTName("a,b)", 1);
IBinding b3 = getBindingFromASTName("b)", 1);
IBinding b4 = getBindingFromASTName("d)", 1);
IBinding b5 = getBindingFromASTName("left(a,b)", 4);
IBinding b6 = getBindingFromASTName("left(a,b)", 4);
}
// class A {};
// template<typename T1, typename T2> class D {};
// template<typename X1> class D<X1,X1> {};
// D<A,A> daa;
public void testClassPartialSpecializations_199572() throws Exception {
IBinding b0= getBindingFromASTName("D<A,A>", 6);
assertInstance(b0, ICPPTemplateInstance.class);
assertInstance(b0, ICPPClassType.class);
IBinding b1= getBindingFromASTName("D<A,A>", 1);
assertInstance(b1, ICPPTemplateDefinition.class);
assertInstance(b1, ICPPClassType.class);
}
// template<typename _TpAllocator>
// class Allocator {
// public:
// typedef _TpAllocator& alloc_reference;
// };
//
// template<typename _TpRebind>
// struct rebind {
// typedef Allocator<_TpRebind> other;
// };
//
// template<typename _Tp, typename _Alloc = Allocator<_Tp> >
// class Vec {
// public:
// typedef typename rebind<_Tp>::other::alloc_reference reference;
// };
// void f(Vec<int>::reference r) {}
public void testTemplateTypedef_214447() throws Exception {
IBinding b0= getBindingFromASTName("r)", 1);
assertInstance(b0, ICPPVariable.class);
IType type = ((ICPPVariable) b0).getType();
type = SemanticUtil.getUltimateType(type, false);
assertInstance(type, IBasicType.class);
assertEquals("int", ASTTypeUtil.getType(type));
}
// template <typename T>
// struct D;
//
// template <typename C, typename U>
// struct D<void (C::*)(U)> {
// typedef U type;
// };
//
// template <typename T>
// using E = typename D<decltype(&T::operator())>::type;
//
// template <typename T>
// struct G {
// typedef E<T> type;
// };
//
// template <typename T>
// using F = typename G<T>::type;
//
// template <typename T, typename U>
// struct B {};
//
// template <typename T>
// B<F<T>, int>* f(T t);
//
// template <typename U>
// void waldo(B<double, U>* e);
// struct A {
// void operator()(double x);
// };
//
// void test() {
// waldo(f(A()));
// }
public void testTemplateArgumentDeduction_507511() throws Exception {
checkBindings();
}
// class A {}; class B {}; class X {};
// template<typename T>
// class C {
// public:
// T t;
// operator B() {B b; return b;}
// };
// template<typename T>
// class D : public C<T> {};
// class E : public C<A> {};
// void foo(B b) {}
// template<>
// class C<X> {
// public:
// X t;
// operator B() {B b; return b;}
// };
// class F : public C<A> {};
// void refs() {
// C<A> c;
// foo(c);
// D<A> d;
// foo(d);
// E e;
// foo(e);
// F f;
// foo(f);
// C<X> cx;
// foo(cx);
// }
public void testUserDefinedConversionOperator_224364() throws Exception {
IBinding ca= getBindingFromASTName("C<A>", 4);
assertInstance(ca, ICPPClassType.class);
assertInstance(ca, ICPPTemplateInstance.class);
IBinding foo1= getBindingFromASTName("foo(c)", 3);
IBinding da= getBindingFromASTName("D<A>", 4);
assertInstance(da, ICPPClassType.class);
assertInstance(da, ICPPTemplateInstance.class);
IBinding foo2= getBindingFromASTName("foo(d)", 3);
IBinding foo3= getBindingFromASTName("foo(e)", 3);
IBinding foo4= getBindingFromASTName("foo(cx)", 3);
assertEquals(foo1, foo2);
assertEquals(foo2, foo3);
assertEquals(foo3, foo4);
}
// template<typename T>
// class A {};
//
// class B {};
//
// template<>
// class A<B> {};
// class C {};
//
// A<B> ab;
// A<C> ac;
public void testEnclosingScopes_a() throws Exception {
ICPPSpecialization b0= getBindingFromASTName("A<B>", 4, ICPPSpecialization.class, ICPPClassType.class);
ICPPTemplateInstance b1= getBindingFromASTName("A<C>", 4, ICPPTemplateInstance.class, ICPPClassType.class);
ICPPClassType sc0= assertInstance(b0.getSpecializedBinding(), ICPPClassType.class);
ICPPClassType sc1= assertInstance(b1.getSpecializedBinding(), ICPPClassType.class);
assertTrue(sc0.isSameType(sc1));
assertEquals(EScopeKind.eGlobal, sc0.getScope().getKind());
assertEquals(EScopeKind.eGlobal, b0.getScope().getKind());
}
// template<typename T>
// class A {
// public:
// class B {};
// };
//
// class C {}; class D {};
//
// template<>
// class A<C> {
// public:
// class B {};
// };
// void refs() {
// A<C>::B acb;
// A<D>::B adb;
// }
public void testEnclosingScopes_b() throws Exception {
ICPPClassType b0= getBindingFromASTName("B acb", 1, ICPPClassType.class);
ICPPClassType b1= getBindingFromASTName("B adb", 1, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType b2= getBindingFromASTName("A<C>", 4, ICPPClassType.class, ICPPSpecialization.class);
IIndexBinding[] sr = getIndex().findBindings("A".toCharArray(), new IndexFilter() {
@Override
public boolean acceptBinding(IBinding binding) throws CoreException {
return !(binding instanceof ICPPSpecialization);
}
}, npm());
assertTrue(sr.length == 1);
ICPPClassType b3= (ICPPClassType) sr[0];
sr = getIndex().findBindings(new char[][] {"A".toCharArray(), "B".toCharArray()}, new IndexFilter() {
@Override
public boolean acceptBinding(IBinding binding) throws CoreException {
return binding instanceof ICPPSpecialization;
}
}, npm());
assertTrue(sr.length == 1);
ICPPClassType b4= (ICPPClassType) sr[0];
assertFalse(b0 instanceof ICPPSpecialization);
IIndexScope s0= (IIndexScope) b0.getScope();
IIndexScope s4= (IIndexScope) b4.getScope();
IScope s1= b1.getScope();
assertTrue(((IType)s0.getScopeBinding()).isSameType((IType)((IIndexScope)b2.getCompositeScope()).getScopeBinding()));
ICPPClassScope cs1= assertInstance(s1, ICPPClassScope.class);
assertInstance(cs1.getClassType(), ICPPClassType.class);
assertInstance(cs1.getClassType(), ICPPTemplateInstance.class);
assertTrue(((IType)((ICPPClassSpecialization) s4.getScopeBinding()).getSpecializedBinding()).isSameType( (IType) ((IIndexScope)b3.getCompositeScope()).getScopeBinding() ));
}
// class A {};
//
// template<typename T>
// class X {
// public:
// class Y {
// public:
// class Z {};
// };
// };
// X<A>::Y::Z xayz;
public void testEnclosingScopes_c() throws Exception {
ICPPClassType b0= getBindingFromASTName("Y::Z x", 1, ICPPClassType.class);
ICPPClassType b1= getBindingFromASTName("Z xayz", 1, ICPPClassType.class);
IScope s0= b0.getScope(), s1= b1.getScope();
ICPPClassScope cs0= assertInstance(s0, ICPPClassScope.class);
assertInstance(cs0.getClassType(), ICPPClassType.class);
assertInstance(cs0.getClassType(), ICPPSpecialization.class);
ICPPClassScope cs1= assertInstance(s1, ICPPClassScope.class);
assertInstance(cs1.getClassType(), ICPPClassType.class);
assertInstance(cs1.getClassType(), ICPPSpecialization.class);
}
// class A {}; class B {};
//
// template<typename T1, typename T2>
// class X {};
//
// template<typename T3>
// class X<T3, A> {
// public:
// class N {};
// };
// X<B,A>::N n;
public void testEnclosingScopes_d() throws Exception {
ICPPClassType b0= getBindingFromASTName("N n", 1, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType b1= assertInstance(((ICPPSpecialization) b0).getSpecializedBinding(), ICPPClassType.class);
ICPPClassScope s0= assertInstance(b0.getScope(), ICPPClassScope.class);
assertInstance(s0.getClassType(), ICPPTemplateInstance.class);
ICPPClassScope s1= assertInstance(b1.getScope(), ICPPClassScope.class);
assertInstance(s1.getClassType(), ICPPTemplateDefinition.class);
assertEquals(EScopeKind.eGlobal, s1.getClassType().getScope().getKind());
}
// typedef signed int SI;
//
// template <SI x>
// class A {};
// const SI y= 99;
// A<y> ay;
public void testNonTypeTemplateParameter_207840() {
ICPPVariable b0= getBindingFromASTName("y>", 1, ICPPVariable.class);
ICPPClassType b1= getBindingFromASTName("A<y>", 1, ICPPClassType.class, ICPPTemplateDefinition.class);
ICPPTemplateInstance b2= getBindingFromASTName("A<y>", 4, ICPPTemplateInstance.class, ICPPClassType.class);
ICPPTemplateParameterMap args= b2.getTemplateParameterMap();
assertEquals(1, args.getAllParameterPositions().length);
}
// template <class T> class A {
// class B { T t; };
// B b;
// };
// void f() {
// A<int> a;
// a.b.t;
// }
public void testNestedClassTypeSpecializations() throws Exception {
ICPPField t2 = getBindingFromASTName("t;", 1, ICPPField.class);
assertTrue(t2 instanceof ICPPSpecialization);
final IType type = t2.getType();
assertTrue(type instanceof IBasicType);
assertEquals("int", ASTTypeUtil.getType(type));
}
// template<typename _Iterator> struct iterator_traits {
// typedef typename _Iterator::pointer pointer;
// };
//
// template<typename _Tp> struct iterator_traits<_Tp*> {
// typedef _Tp* pointer;
// };
//
// template<typename _Iterator, typename _Container> class normal_iterator {
// protected:
// _Iterator _M_current;
//
// public:
// typedef typename iterator_traits<_Iterator>::pointer pointer;
// normal_iterator() : _M_current(_Iterator()) { }
//
// pointer operator->() const {
// return _M_current;
// }
// };
//
// template<typename _Tp> class allocator {
// public:
// typedef _Tp* pointer;
// };
//
// template<typename _Tp, typename _Alloc = allocator<_Tp> >
// class vector {
// typedef vector<_Tp, _Alloc> vector_type;
//
// public:
// typedef typename _Alloc::pointer pointer;
// typedef normal_iterator<pointer, vector_type> iterator;
// };
//
// struct MyStruct {
// int member;
// };
// typedef vector<MyStruct> VS1;
// void test() {
// VS1::iterator it;
// it->member; // it->member
// }
public void testVectorIterator() throws Exception {
ICPPField t2 = getBindingFromASTName("member; // it->member", 6, ICPPField.class);
ICPPClassType ct= t2.getClassOwner();
assertEquals("MyStruct", ct.getName());
final IType type = t2.getType();
assertTrue(type instanceof IBasicType);
assertEquals("int", ASTTypeUtil.getType(type));
}
// struct A {
// template<typename T>
// struct S;
// };
// template<typename T>
// struct A::S {};
// A::S<int> a;
public void testMemberTemplateClass() throws Exception {
checkBindings();
}
// template <int x>
// class C {
// public:
// inline C() {};
// };
//
// const int _256=0x100;
//
// typedef C<_256> aRef;
//
// void foo(aRef& aRefence) {}
// void bar(C<_256>& aRefence) {}
// void baz(void) {}
// int main (void) {
// C<256> t;
// foo(t);
// bar(t);
// baz();
// }
public void testClassInstanceWithNonTypeArgument_207871() throws Exception {
ICPPTemplateInstance c256 = getBindingFromASTName("C<256>", 6, ICPPTemplateInstance.class, ICPPClassType.class);
ICPPTemplateParameterMap paramMap = c256.getTemplateParameterMap();
assertEquals(1, paramMap.getAllParameterPositions().length);
ICPPTemplateArgument arg = paramMap.getArgument(0);
assertEquals(Long.valueOf(256), arg.getNonTypeValue().numberValue());
assertInstance(arg.getTypeOfNonTypeValue(), ICPPBasicType.class);
ICPPFunction foo = getBindingFromASTName("foo(t)", 3, ICPPFunction.class);
ICPPFunction bar = getBindingFromASTName("bar(t)", 3, ICPPFunction.class);
}
// template<class T, int x> class A {public: class X {};};
// template<class T1> class A<T1,'y'> {public: class Y {};};
// template<class T2> class A<T2,'z'> {public: class Z {};};
//
// class B {};
// A<B, 'x'>::X x;
// A<B, 'y'>::Y y;
// A<B, 'z'>::Z z;
public void testNonTypeCharArgumentDisambiguation() throws Exception {
ICPPClassType b2= getBindingFromASTName("A<B, 'x'>", 9, ICPPClassType.class, ICPPTemplateInstance.class);
ICPPClassType b3= getBindingFromASTName("A<B, 'y'>", 9, ICPPClassType.class, ICPPTemplateInstance.class);
ICPPClassType b4= getBindingFromASTName("A<B, 'z'>", 9, ICPPClassType.class, ICPPTemplateInstance.class);
assertTrue(!b2.isSameType(b3));
assertTrue(!b3.isSameType(b4));
assertTrue(!b4.isSameType(b2));
ICPPClassType X= getBindingFromASTName("X x", 1, ICPPClassType.class);
ICPPClassType Y= getBindingFromASTName("Y y", 1, ICPPClassType.class);
ICPPClassType Z= getBindingFromASTName("Z z", 1, ICPPClassType.class);
assertTrue(!X.isSameType(Y));
assertTrue(!Y.isSameType(Z));
assertTrue(!Z.isSameType(X));
}
// template<class T, bool b> class A {public: class X {};};
// template<class T1> class A<T1,true> {public: class Y {};};
//
// class B {};
// A<B, false>::X x; //1
// A<B, true>::Y y; //2
//
// A<B, true>::X x; //3 should be an error
// A<B, false>::Y y; //4 should be an error
public void testNonTypeBooleanArgumentDisambiguation() throws Exception {
ICPPClassType X= getBindingFromASTName("X x; //1", 1, ICPPClassType.class);
ICPPClassType Y= getBindingFromASTName("Y y; //2", 1, ICPPClassType.class);
getProblemFromASTName("X x; //3", 1);
getProblemFromASTName("Y y; //4", 1);
assertTrue(!X.isSameType(Y));
}
// template<int x> class A {};
// template<> class A<5> {public: class B{};};
//
// const int FIVE= 5;
// const int CINQ= FIVE;
// const int FUNF= CINQ;
// void refs() {
// A<FIVE> a5a;
// A<CINQ> a5b;
// A<FUNF> a5c;
// A<5> a5d;
// A<1> a1;
// }
public void testConstantPropagationFromHeader() throws Exception {
ICPPClassType a5a= getBindingFromASTName("A<FIVE>", 7, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType a5b= getBindingFromASTName("A<CINQ>", 7, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType a5c= getBindingFromASTName("A<FUNF>", 7, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType a5d= getBindingFromASTName("A<5>", 4, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType a1= getBindingFromASTName("A<1>", 4, ICPPClassType.class, ICPPTemplateInstance.class);
assertTrue(a5a.isSameType(a5b));
assertTrue(a5b.isSameType(a5c));
assertTrue(a5c.isSameType(a5d));
assertTrue(a5d.isSameType(a5a));
assertTrue(!a1.isSameType(a5a));
assertTrue(!a1.isSameType(a5b));
assertTrue(!a1.isSameType(a5c));
assertTrue(!a1.isSameType(a5d));
}
// template<int I>
// class That {
// public:
// That(int x) {}
// };
//
// template<int T>
// class This : public That<T> {
// public:
// inline This();
// };
// template <int I>
// inline This<I>::This() : That<I>(I) {
// }
public void testParameterReferenceInChainInitializer_a() throws Exception {
// These intermediate assertions will not hold until deferred non-type arguments are
// correctly modelled
/*
ICPPClassType tid= ba.assertNonProblem("This<I>::T", 7, ICPPClassType.class);
assertFalse(tid instanceof ICPPSpecialization);
ICPPConstructor th1sCtor= ba.assertNonProblem("This() :", 4, ICPPConstructor.class);
assertFalse(th1sCtor instanceof ICPPSpecialization);ICPPTemplateNonTypeParameter np= ba.assertNonProblem("I)", 1, ICPPTemplateNonTypeParameter.class);
*/
ICPPTemplateNonTypeParameter np= getBindingFromASTName("I>(I)", 1, ICPPTemplateNonTypeParameter.class);
ICPPConstructor clazz= getBindingFromASTName("That<I>(I)", 4, ICPPConstructor.class);
ICPPConstructor ctor= getBindingFromASTName("That<I>(I)", 7, ICPPConstructor.class);
}
// template<typename I>
// class That {
// public:
// That() {}
// };
//
// template<typename T>
// class This : public That<T> {
// public:
// inline This();
// };
// template <typename I>
// inline This<I>::This() : That<I>() {
// }
public void testParameterReferenceInChainInitializer_b() throws Exception {
ICPPClassType tid= getBindingFromASTName("This<I>::T", 7, ICPPClassType.class);
assertFalse(tid instanceof ICPPSpecialization);
ICPPConstructor th1sCtor= getBindingFromASTName("This() :", 4, ICPPConstructor.class);
assertFalse(th1sCtor instanceof ICPPSpecialization);
ICPPTemplateTypeParameter np= getBindingFromASTName("I>()", 1, ICPPTemplateTypeParameter.class);
ICPPConstructor clazz= getBindingFromASTName("That<I>()", 4, ICPPConstructor.class);
ICPPConstructor ctor= getBindingFromASTName("That<I>()", 7, ICPPConstructor.class);
}
// template<typename T> class CT {
// public: int field;
// };
// CT<int> v1;
public void testUniqueSpecializations_241641() throws Exception {
ICPPVariable v1= getBindingFromASTName("v1", 2, ICPPVariable.class);
ICPPVariable v2= getBindingFromASTName("v1", 2, ICPPVariable.class);
IType t1= v1.getType();
assertInstance(t1, ICPPClassType.class);
ICPPClassType ct= (ICPPClassType) t1;
IBinding f1= ct.getCompositeScope().find("field")[0];
IBinding f2= ct.getCompositeScope().find("field")[0];
assertSame(f1, f2);
}
// template<typename T> class CT {
// public: int field;
// };
// CT<int> v1;
public void testUniqueInstance_241641() throws Exception {
IASTName name= findName("v1", 2);
ICPPVariable v1= getBindingFromASTName("v1", 2, ICPPVariable.class);
IType t1= v1.getType();
assertInstance(t1, ICPPTemplateInstance.class);
ICPPTemplateInstance inst= (ICPPTemplateInstance) t1;
final ICPPClassTemplate tmplDef = (ICPPClassTemplate) inst.getTemplateDefinition();
IBinding inst2= CPPTemplates.instantiate(tmplDef, inst.getTemplateArguments());
assertSame(inst, inst2);
IBinding charInst1= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateTypeArgument(new CPPBasicType(Kind.eChar, 0))});
IBinding charInst2= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateTypeArgument(new CPPBasicType(Kind.eChar, 0))});
assertSame(charInst1, charInst2);
}
// template<typename T> class XT {
// public: void method() {};
// };
// XT<int> x;
// void test() {
// x.method();
// }
public void testMethodSpecialization_248927() throws Exception {
ICPPMethod m= getBindingFromASTName("method", 6, ICPPMethod.class);
assertInstance(m, ICPPSpecialization.class);
ICPPClassType ct= m.getClassOwner();
assertInstance(ct, ICPPTemplateInstance.class);
ICPPMethod[] ms= ct.getDeclaredMethods();
assertEquals(1, ms.length);
assertEquals(m, ms[0]);
}
// template<class T, class U> class A {};
// template<class T> class A<T, int> {
// void foo(T t);
// };
// template<class T> void A<T, int>::foo(T t) {}
public void testBug177418() throws Exception {
ICPPMethod m= getBindingFromASTName("foo", 3, ICPPMethod.class);
ICPPClassType owner= m.getClassOwner();
assertInstance(owner, ICPPClassTemplatePartialSpecialization.class);
}
// template<typename T> class XT {
// int f;
// void m();
// };
// template<typename T> void XT<T>::m() {
// m(); // 1
// f; // 1
// this->m(); // 2
// this->f; // 2
// };
public void testUnknownBindings_264988() throws Exception {
ICPPMethod m= getBindingFromASTName("m(); // 1", 1, ICPPMethod.class);
assertFalse(m instanceof ICPPUnknownBinding);
m= getBindingFromASTName("m(); // 2", 1, ICPPMethod.class);
assertFalse(m instanceof ICPPUnknownBinding);
ICPPField f= getBindingFromASTName("f; // 1", 1, ICPPField.class);
assertFalse(f instanceof ICPPUnknownBinding);
f= getBindingFromASTName("f; // 2", 1, ICPPField.class);
assertFalse(f instanceof ICPPUnknownBinding);
}
// template <typename T= int> class XT;
// template <typename T> class XT {};
// void test() {
// XT<> x;
// };
public void testDefaultTemplateArgInHeader_264988() throws Exception {
ICPPTemplateInstance ti= getBindingFromASTName("XT<>", 4, ICPPTemplateInstance.class);
}
// typedef int TInt;
// template <typename T> class XT {
// void m();
// };
// template<> void XT<int>::m() {
// TInt t;
// }
public void testParentScopeOfSpecialization_267013() throws Exception {
ITypedef ti= getBindingFromASTName("TInt", 4, ITypedef.class);
}
// struct __true_type {};
// struct __false_type {};
//
// template<typename, typename>
// struct __are_same {
// enum { __value = 0 };
// typedef __false_type __type;
// };
//
// template<typename _Tp>
// struct __are_same<_Tp, _Tp> {
// enum { __value = 1 };
// typedef __true_type __type;
// };
//
// template<bool, typename>
// struct __enable_if {};
//
// template<typename _Tp>
// struct __enable_if<true, _Tp> {
// typedef _Tp __type;
// };
//
// template<typename _Iterator, typename _Container>
// struct __normal_iterator {
// template<typename _Iter>
// __normal_iterator(
// const __normal_iterator<
// _Iter,
// typename __enable_if<
// __are_same<_Iter, typename _Container::pointer>::__value,
// _Container
// >::__type
// >& __i);
// };
//
// template<typename _Tp>
// struct allocator {
// typedef _Tp* pointer;
// typedef const _Tp* const_pointer;
//
// template<typename _Tp1>
// struct rebind
// { typedef allocator<_Tp1> other; };
// };
//
// template<typename _Tp, typename _Alloc = allocator<_Tp> >
// struct vector {
// typedef vector<_Tp, _Alloc> vector_type;
// typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
//
// typedef typename _Tp_alloc_type::pointer pointer;
// typedef typename _Tp_alloc_type::const_pointer const_pointer;
// typedef __normal_iterator<pointer, vector_type> iterator;
// typedef __normal_iterator<const_pointer, vector_type> const_iterator;
//
// iterator begin();
// const_iterator begin() const;
// };
// void f(vector<int>::const_iterator p);
//
// void test() {
// vector<int> v;
// f(v.begin());
// }
public void testTemplateMetaprogramming_284686() throws Exception {
getBindingFromASTName("f(v.begin())", 1, ICPPFunction.class);
}
// template<typename T> class op {
// public:
// inline static int DO(T key, T key2) {
// return false;
// }
// };
//
// template<typename T, int KVT_KeyCompareProc(T key, T key2)=op<T>::DO> class Noder1 {};
// template<typename T, int KVT_KeyCompareProc(T key, T key2)=op<T>::DO> class Noder2 {};
//
// void test() {
// Noder1<int> f;
// Noder2<int> g;
// }
public void testInstantiationOfValue_284683() throws Exception {
getBindingFromASTName("Noder1<int>", 11, ICPPClassSpecialization.class);
getBindingFromASTName("Noder2<int>", 11, ICPPClassSpecialization.class);
}
// template <typename> struct CT;
// template <typename T> struct CT {
// T f;
// };
// struct X {
// int x;
// };
// void test() {
// CT<X> p;
// p.f.x;
// }
public void testTemplateParameterWithoutName_300978() throws Exception {
getBindingFromASTName("x;", 1, ICPPField.class);
ICPPClassSpecialization ctx = getBindingFromASTName("CT<X>", 5, ICPPClassSpecialization.class);
ICPPClassTemplate ct= (ICPPClassTemplate) ctx.getSpecializedBinding();
assertEquals("T", ct.getTemplateParameters()[0].getName());
}
// template<typename T> class X {};
// template<typename T> class Y {};
// template<> class Y<int> {};
// template<typename T> void f(T t) {}
// template<typename T> void g(T t) {}
// template<> void g(int t) {}
// void test() {
// X<int> x;
// Y<int> y;
// f(1);
// g(1);
// }
public void testExplicitSpecializations_296427() throws Exception {
ICPPTemplateInstance inst;
inst= getBindingFromASTName("X<int>", 0);
assertFalse(inst.isExplicitSpecialization());
inst = getBindingFromASTName("Y<int>", 0);
assertTrue(inst.isExplicitSpecialization());
inst = getBindingFromASTName("f(1)", 1);
assertFalse(inst.isExplicitSpecialization());
inst = getBindingFromASTName("g(1)", 1);
assertTrue(inst.isExplicitSpecialization());
}
// template<typename _CharT> struct OutStream {
// OutStream& operator<<(OutStream& (*__pf)(OutStream&));
// };
// template<typename _CharT> OutStream<_CharT>& endl(OutStream<_CharT>& __os);
// void test() {
// OutStream<char> out;
// out << endl;
// }
public void testInstantiationOfEndl_297457() throws Exception {
final IBinding reference = getBindingFromASTName("<< endl", 2);
assertTrue(reference instanceof ICPPSpecialization);
}
// template <typename T = int> class enclosing {
// template <typename P1, typename P2, bool P1_matches, bool P2_matches>
// struct sort_out_types_impl;
// template <typename P1, typename P2> struct sort_out_types_impl<P1, P2, true, false> {
// typedef P1 matching_type;
// };
// template <typename P1, typename P2> struct sort_out_types_impl<P1, P2, false, true> {
// typedef P2 matching_type;
// };
// };
// template <typename P1, typename P2, template <typename> class Predicate>
// struct sort_out_types {
// static const bool P1_matches = Predicate<P1>::value;
// static const bool P2_matches = Predicate<P2>::value;
// typedef typename enclosing<>::sort_out_types_impl<P1, P2, P1_matches, P2_matches>::matching_type matching_type;
// };
// template <typename T> struct type_predicate {
// static const bool value = false;
// };
// template <> struct type_predicate<int> {
// static const bool value = true;
// };
// template <typename P1, typename P2> struct A {
// typedef typename sort_out_types<P1, P2, type_predicate>::matching_type arg_type;
// void f(arg_type);
// };
// int main() {
// A<float, int> a;
// a.f(0);
// return 0;
// }
public void testPartialSpecializationsOfClassTemplateSpecializations_332884() throws Exception {
final IBinding reference = getBindingFromASTName("f(0)", 1);
assertTrue(reference instanceof ICPPSpecialization);
}
// template<typename T> struct Base {
// int bfield;
// void bmethod();
// };
// template<typename T> struct XT : Base<T> {
// int field;
// void method() {};
// friend void f();
// struct Nested {};
// };
// struct TXT : XT<int> {};
// TXT x;
public void testClassSpecialization_354086() throws Exception {
ICPPClassType ct= getBindingFromASTName("TXT", 0, ICPPClassType.class);
ICPPMethod[] methods = ct.getAllDeclaredMethods();
assertEquals(2, methods.length);
methods= ct.getConstructors();
assertEquals(2, methods.length);
methods= ct.getMethods();
assertEquals(14, methods.length);
ICPPBase[] bases = ct.getBases();
assertEquals(1, bases.length);
IField field = ct.findField("bfield");
assertNotNull(field);
IField[] fields = ClassTypeHelper.getFields(ct);
assertEquals(2, fields.length);
IBinding[] friends = ct.getFriends();
assertEquals(0, friends.length); // not yet supported
}
// struct A {
// void f() { }
// };
// template <typename T> struct B : A {
// using A::f;
// void f(int) { }
// };
// template <typename T> struct C : B<T> {
// using B<T>::f;
// void f(int, int);
// };
// B<float> b;
// C<float> c;
// void test() {
// b.f();
// b.f(1);
// c.f( );
// c.f(2);
// c.f(2,1);
// }
public void testSpecializationOfUsingDeclaration_357293() throws Exception {
getBindingFromASTName("f()", 1, ICPPMethod.class);
getBindingFromASTName("f(1)", 1, ICPPMethod.class);
getBindingFromASTName("f( )", 1, ICPPMethod.class);
getBindingFromASTName("f(2)", 1, ICPPMethod.class);
getBindingFromASTName("f(2,1)", 1, ICPPMethod.class);
}
// template<class T> struct C1 {
// typedef int iterator;
// iterator m1();
// };
// template<class T> typename C1<T>::iterator C1<T>::m1() {
// return 0;
// }
public void testUsageOfClassTemplateOutsideOfClassBody_357320() throws Exception {
getBindingFromASTName("m1", 0, ICPPMethod.class);
}
// template <typename> struct foo;
// template <> struct foo<int> {
// typedef int type;
// };
// template <typename> struct foo {};
// int main() {
// typedef foo<int>::type type;
// }
public void testSpecializationInIndex_367563a() throws Exception {
getBindingFromASTName("type type", 4, ITypedef.class);
}
// template <typename> struct foo;
// template <typename T> struct foo<T*> {
// typedef int type;
// };
// template <typename> struct foo {};
// int main() {
// typedef foo<int*>::type type;
// }
public void testSpecializationInIndex_367563b() throws Exception {
getBindingFromASTName("type type", 4, ITypedef.class);
}
// template <typename T>
// struct A {};
//
// template <>
// struct A<void> {
// template <typename U>
// A<void>(const A<U>& o);
// };
// void waldo(A<void> p);
//
// void test(A<int> a) {
// waldo(a);
// }
public void testSpecializationInIndex_491636() throws Exception {
checkBindings();
}
// template <typename T> struct remove_const_impl {};
// template <typename T> struct remove_const_impl<T*> {
// typedef T type;
// };
// template <typename T> struct remove_const_impl<const T*> {
// typedef T type;
// };
// template <typename T> struct remove_const {
// typedef typename remove_const_impl<T*>::type type;
// };
// template<typename Seq> struct foo;
// template <> struct foo<int> {
// typedef int type;
// };
// typedef foo<remove_const<const int>::type>::type t;
public void testCurrentInstanceOfClassTemplatePartialSpec_368404() throws Exception {
ITypedef tdef= getBindingFromASTName("type t;", 4, ITypedef.class);
assertEquals("int", ASTTypeUtil.getType(tdef, true));
}
// template<typename T, T v>
// struct integral_constant {
// static constexpr T value = v;
// typedef T value_type;
// typedef integral_constant<T, v> type;
// };
//
// typedef integral_constant<bool, true> true_type;
//
// typedef integral_constant<bool, false> false_type;
//
// template<typename T>
// class helper {
// typedef char one;
// typedef struct { char arr[2]; } two;
// template<typename U> struct Wrap_type {};
// template<typename U> static one test(Wrap_type<typename U::category>*);
// template<typename U> static two test(...);
// public: static const bool value = sizeof(test<T>(0)) == 1;
// };
//
// template<typename T>
// struct has_category : integral_constant<bool, helper<T>::value> {};
//
// template<typename Iterator, bool = has_category<Iterator>::value>
// struct traits {};
//
// template<typename Iterator>
// struct traits<Iterator, true> {
// typedef typename Iterator::value_type value_type;
// };
//
// struct tag {};
// struct C {
// typedef int value_type;
// typedef tag category;
// };
//
// template<typename It, typename Val = typename traits<It>::value_type>
// class A {
// };
//
// typedef A<C> type;
public void testSfinae_a() throws Exception {
checkBindings();
}
// template <bool B, typename T = void> struct enable_if { typedef T type; };
// template <typename T> struct enable_if<false, T> {};
//
// template <typename T> struct is_int { static const bool value = false; };
// template <> struct is_int<int> { static const bool value = true; };
//
// template <typename T> struct is_double { static const bool value = false; };
// template <> struct is_double<double> { static const bool value = true; };
//
// template <typename T, typename Enabled = void>
// struct A {
// static int get() { return 0; }
// };
//
// template<typename T>
// struct A<T, typename enable_if<is_double<T>::value>::type> {
// static int get() { return 1; }
// };
//
// template <typename T>
// struct A<T, typename enable_if<is_int<T>::value>::type> {
// static int get() { return 2; }
// };
// void test() {
// A<double>::get();
// A<int>::get();
// }
public void testSfinae_b() throws Exception {
checkBindings();
}
// template<typename T, typename = decltype(new T(0))>
// static void test(int);
//
// template<typename>
// static int test(...);
// struct A {};
//
// int waldo(int p);
//
// int x = waldo(test<A>(0));
public void testSfinaeInNewExpression_430230() throws Exception {
checkBindings();
}
// struct CString {
// template<template<class,class> class ListT, class UType, class Alloc, typename StringT>
// void split(ListT<UType,Alloc>& out, const StringT& sep, bool keepEmptyElements = false, bool trimElements = true, bool emptyBefore = true) const;
// };
// template<template<class,class> class ListT, class UType, class Alloc, class StringT>
// void CString::split(ListT<UType,Alloc>& out, const StringT& sep, bool keepEmptyElements, bool trimElements, bool emptyBefore) const {
// }
public void testMemberOfTemplateTemplateParameter_381824() throws Exception {
checkBindings();
}
// template<typename T>
// struct S {
// T t;
// };
// template<typename T>
// using TAlias = S<T>;
// void foo() {
// TAlias<int> myA;
// myA.t = 42;
// }
public void testAliasTemplate() throws Exception {
checkBindings();
}
// template <typename T>
// struct B {
// enum { value = 1 };
// };
//
// template <typename T>
// struct C {
// enum { id = B<T>::value };
// };
// void test() {
// int x = C<bool>::id;
// }
public void testDependentEnumValue_389009() throws Exception {
IEnumerator binding = getBindingFromASTName("id;", 2, IEnumerator.class);
IValue value = binding.getValue();
Number num = value.numberValue();
assertNotNull(num);
assertEquals(1, num.longValue());
}
// template<typename T>
// struct meta {
// enum {
// a = T::value,
// b = a
// };
// };
// struct S {
// static const int value = 42;
// };
//
// template <int> struct waldo;
//
// template <>
// struct waldo<42> {
// double operator()();
// };
//
// template <typename>
// struct C : public waldo<meta<S>::b> {};
//
// void bar(double);
//
// void foo(C<S> x){
// bar(x());
// }
public void testDependentEnumerator_482421a() throws Exception {
checkBindings();
}
// template<typename T>
// struct meta {
// enum {
// b = T::value,
// a = b
// };
// };
// struct S {
// static const int value = 42;
// };
//
// template <int> struct waldo;
//
// template <>
// struct waldo<42> {
// double operator()();
// };
//
// template <typename>
// struct C : public waldo<meta<S>::a> {};
//
// void bar(double);
//
// void foo(C<S> x){
// bar(x());
// }
public void testDependentEnumerator_482421b() throws Exception {
checkBindings();
}
// template<typename U>
// struct A {
// typedef U type1;
//
// template<typename V>
// struct rebind {
// typedef A<V> other;
// };
// };
//
// template<typename T, typename U>
// struct B {
// template<typename T2, typename U2>
// static constexpr bool test(typename T2::template rebind<U2>::other*) {
// return true;
// }
//
// template<typename, typename>
// static constexpr bool test(...) {
// return false;
// }
//
// static const bool value = test<T, U>(nullptr);
// };
//
// template<typename T, typename U, bool = B<T, U>::value>
// struct C;
//
// template<typename T, typename U>
// struct C<T, U, true> {
// typedef typename T::template rebind<U>::other type2;
// };
//
// template<typename T1>
// struct D {
// typedef typename T1::type1 type3;
//
// template<typename U1>
// using rebind2 = typename C<T1, U1>::type2;
// };
//
// template<typename T>
// struct E : D<T> {
// typedef D<T> Base;
// typedef typename Base::type3& type4;
//
// template<typename U>
// struct rebind {
// typedef typename Base::template rebind2<U> other;
// };
// };
//
// template<typename U, typename T = A<U>>
// struct F {
// typedef typename E<T>::template rebind<U>::other type5;
// typedef typename E<type5>::type4 type6;
// type6 operator[](int n);
// };
//
// void f(int);
// void test() {
// F<int*> a;
// f(*a[0]);
// }
public void testConstexprFunction_395238_1() throws Exception {
checkBindings();
}
// template<typename T>
// struct A {
// template<typename U>
// static constexpr U test(U v) {
// return v;
// }
//
// template<typename>
// static constexpr bool test(...) {
// return false;
// }
//
// static const bool value = test<T>(true);
// };
//
// template<typename T, bool = A<T>::value>
// struct B;
//
// template<typename T>
// struct B<T, true> {
// typedef T type;
// };
// B<bool>::type x;
// B<int*>::type y;
public void testConstexprFunction_395238_2() throws Exception {
ITypedef td = getBindingFromFirstIdentifier("type x", ITypedef.class);
assertEquals("bool", ASTTypeUtil.getType(td.getType()));
getProblemFromFirstIdentifier("type y");
}
// template <class RandomAccessRange, class BinaryPredicate>
// void sort(const RandomAccessRange& rng, BinaryPredicate pred);
//
// struct S {};
// const S* s[5];
// template <typename BinaryPredicate>
// void test(BinaryPredicate bp) {
// sort(s, [&bp](const S* a, const S* b){ return bp(*a, *b); });
// }
public void testLambdaExpression_395884() throws Exception {
checkBindings();
}
// template <typename T> int bar(T);
// template <int N> struct S {
// template <typename T> auto foo(T t) const -> decltype(bar(t));
// };
// void f(int);
// void test() {
// S<1> n;
// f(n.foo(0));
// }
public void testDependentExpression_395875() throws Exception {
getBindingFromASTName("f(n.foo(0))", 1, ICPPFunction.class);
}
// struct true_ {
// static const bool value = true;
// };
//
// struct false_ {
// static const bool value = false;
// };
//
// template <typename T>
// struct has_type {
// template <typename U>
// static true_ test(U*);
//
// template <typename U>
// static false_ test(...);
//
// typedef decltype(test<T>(0)) type;
// };
// struct T {
// typedef int type;
// };
//
// template <bool>
// struct A;
//
// template <>
// struct A<true> {
// typedef int type;
// };
//
// int main() {
// A<has_type<T>::type::value>::type a;
// }
public void testIntNullPointerConstant_407808() throws Exception {
checkBindings();
}
// namespace bar {
// template<class T>
// void join(T);
// }
//
// namespace foo {
// template<typename T>
// void join(T);
//
// struct cat {};
// }
// template <typename T>
// auto waldo(T t) -> decltype(bar::join(t));
//
// int main() {
// waldo(foo::cat{});
// }
public void testADLForQualifiedName_408296() throws Exception {
checkBindings();
}
// template <typename>
// struct waldo {
// };
//
// struct outer {
// template <typename>
// struct inner;
// };
//
// template <typename T>
// struct outer::inner<waldo<T>> {};
// int main() {}
public void testRegression_408314() throws Exception {
checkBindings();
}
// template<typename T> struct A { enum { v = 0 }; };
// template<> struct A<int> { enum { v = 1 }; };
// template<> struct A<int> { enum { v = 1 }; };
// int main() {}
public void testSpecializationRedefinition_409444() throws Exception {
checkBindings();
}
// struct N {
// int node;
// };
//
// template <typename T>
// struct List {
// template <int T::*>
// struct Base {};
// };
// List<N>::Base<&N::node> base;
public void testDependentTemplateParameterInNestedTemplate_407497() throws Exception {
checkBindings();
}
// template <typename T>
// struct enclosing {
// template <typename U = T>
// struct nested {
// typedef U type;
// };
// };
// typedef enclosing<int>::nested<>::type waldo;
public void testDependentTemplateParameterInNestedTemplate_399454() throws Exception {
checkBindings();
}
// void f(int);
//
// template <typename... Args>
// struct A
// {
// template <typename R = decltype(f(Args()...))>
// static R foo();
// };
// typedef decltype(A<int>::foo<>()) waldo;
public void testNPE_407497() throws Exception {
checkBindings();
}
// // Empty header.
// template <typename T, T v>
// constexpr T a() { return v; }
//
// template <typename T>
// constexpr T A(T n, int i, T j = 1) {
// return (i < 1) ? j : (i == 1) ? n * j : A<T>(n * n, i / 2, (i % 2) ? j * n : j);
// }
//
// template <int I, int J, int K, typename T>
// struct B {
// static constexpr int b(T n);
// };
//
// template <int I, int J, typename T>
// struct B<I, J, J, T> {
// static constexpr int b(T n) {
// return J;
// }
// };
//
// template <int I, int J, int K, typename T>
// constexpr int B<I, J, K, T>::b(T n) {
// return (n < a<T, A<T>(I, (J + K) / 2)>()) ?
// B<I, J, (J + K) / 2, T>::b(n) :
// B<I, (J + K) / 2 + 1, K, T>::b(n);
// }
//
// template <int I, typename T>
// constexpr int C(T v = 2000000000) {
// return v < I ? 1 : 1 + C<I, T>(v / I);
// }
//
// template <int I, typename T>
// constexpr int D(T n) {
// return B<I, 1, C<I, T>(), T>::b(n);
// }
//
// static_assert(D<10>(1000000000) == 10, "");
public void testOOM_497875() throws Exception {
// TODO(sprigogin): Uncomment after http://bugs.eclipse.org/497931 is fixed.
// checkBindings();
}
// template <typename>
// struct basic_A {
// bool eof() const;
// };
//
// typedef basic_A<char> A;
// class B : public A {};
//
// class C : public A, public B {};
//
// void foo() {
// C c;
// c.eof();
// }
public void testAmbiguousBaseClassLookup_413406() throws Exception {
getProblemFromASTName("eof();", 3);
}
// template <typename = void>
// struct S;
// template <>
// struct S<void> {
// typedef int type;
// };
//
// template <typename>
// struct S {
// typedef char type;
// };
//
// typedef S<>::type T;
public void testExplicitSpecializationOfTemplateDeclaredInHeader_401820() throws Exception {
IType T = getBindingFromASTName("T", 1);
assertEquals("int", ASTTypeUtil.getType(T));
}
// template <class T, class U>
// struct multipliable2 {
// friend T operator *(const U& lhs, const T& rhs);
// };
//
// template <class T>
// struct multipliable1 {
// friend T operator *(const T& lhs, const T& rhs);
// };
// struct overloaded : multipliable1<overloaded> {};
//
// int foo(overloaded);
//
// int main() {
// overloaded c, d;
// foo(c * d);
// }
public void testFriendFunctionOfClassSpecialization_419301a() throws Exception {
checkBindings();
}
// template <class T, class U>
// struct multipliable2 {
// friend T operator *(const U& lhs, const T& rhs);
// };
//
// template <class T>
// struct multipliable1 {
// friend T operator *(const T& lhs, const T& rhs) {}
// };
// struct overloaded : multipliable1 <overloaded> {};
//
// int foo(overloaded);
//
// int main() {
// overloaded c, d;
// foo(c * d);
// }
public void testFriendFunctionOfClassSpecialization_419301b() throws Exception {
checkBindings();
}
// template <typename T>
// struct A {
// static T* get();
// };
// class B {
// friend class A<B>;
// };
//
// void test() {
// A<B>::get();
// }
public void testFriendClassSpecialization_466362() throws Exception {
checkBindings();
}
// template <typename T>
// constexpr T t(T) {
// return 0;
// }
//
// template <>
// constexpr unsigned t<unsigned>(unsigned) {
// return 1 + 1;
// }
// // empty source file
public void testSpecializationOfConstexprFunction_420995() throws Exception {
checkBindings();
}
// template <typename>
// struct S;
//
// template <>
// struct S<int> {
// static const int value = 42;
// };
//
// template <typename T>
// constexpr int foo() {
// return S<T>::value;
// }
// constexpr int waldo = foo<int>();
public void testInstantiationOfReturnExpression_484959() throws Exception {
ICPPVariable waldo = getBindingFromFirstIdentifier("waldo");
assertVariableValue(waldo, 42);
}
// template <class TYPE>
// class waldo {
// enum {
// X = sizeof(TYPE),
// Y = 1
// };
//
// int value = X && 1;
// };
//
// template <int> struct A {};
//
// template <class TYPE>
// struct impl : A<waldo<TYPE>::value> {};
//
// template <class TYPE>
// struct meta : impl<TYPE>::type {};
//
// template <>
// struct meta<int> {};
// int z;
public void testEnumerationWithMultipleEnumerators_434467() throws Exception {
checkBindings();
}
// template <typename ResultT, ResultT (*Func)()>
// struct Base {
// ResultT operator()() const;
// };
//
// struct S {};
//
// template <typename T>
// class B {};
//
// template<typename T>
// B<T> f();
//
// template <typename T>
// class Derived : public Base<B<S>, f<T> > {};
// const Derived<S> decl;
//
// void bar(const B<S>&);
//
// void foo() {
// bar(decl()); // ERROR HERE: Invalid arguments
// }
public void testInstantiationOfFunctionInstance_437675() throws Exception {
checkBindings();
}
// struct IID { };
//
// struct IUnknown {};
//
// template<class T>
// class IID_DUMMY : IID { };
//
// template<class T>
// const IID &__uuidof(T x) { return IID_DUMMY<T>(); }
//
// static IID IID_IUnknown = {};
//
// template<class T>
// class MYCComPtr { };
//
// template <class T, const IID* piid = &__uuidof<T> >
// class MYCComQIPtr : public MYCComPtr<T> {};
//
// template<>
// class MYCComQIPtr<IUnknown, &IID_IUnknown> : public MYCComPtr<IUnknown> {};
// // source file is deliberately empty
public void testInfiniteRecursionMarshallingTemplateDefinition_439923() throws Exception {
checkBindings();
}
// template<typename T> struct Constraint {
// typedef T Type;
// static const int Scale = 1;
// };
//
// template<int N> struct Operations {
// template<typename T> void operation(typename Constraint<T>::Type);
// template<typename T> void value(T) {
// }
// };
//
// template<> template<typename Q>
// void Operations<4>::operation(typename Constraint<Q>::Type) {
// value<Q>(Constraint<Q>::Scale);
// }
// // empty source file
public void testInfiniteRecursion_516648() throws Exception {
checkBindings();
}
// // Empty header file
// typedef unsigned long size_t;
//
// template <size_t... Is> struct int_pack { typedef int_pack type; };
//
// template <class Pack, size_t I> struct append;
//
// template <size_t... Is, size_t I>
// struct append<int_pack<Is...>, I> : int_pack<Is..., I> {};
//
// template <size_t C>
// struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {};
//
// template <> struct make_int_pack<0> : int_pack<> {};
public void testRecursiveInheritance_466362() throws Exception {
checkBindings();
}
// template <typename T>
// struct Bar {};
//
// template <typename T>
// auto foo(T t) -> Bar<decltype(t.foo)> {
// Bar<decltype(t.foo)> bar; // bogus `invalid template arguments` error here
// return bar;
// }
//
// struct S {
// int foo;
// };
// int main() {
// Bar<int> var1;
// auto var2 = foo(S());
// }
public void testTypeOfUnknownMember_447728() throws Exception {
IVariable var1 = getBindingFromASTName("var1", 4);
IVariable var2 = getBindingFromASTName("var2", 4);
assertSameType(var1.getType(), var2.getType());
}
// template <typename T>
// struct allocator {
// typedef T value_type;
// };
// template <typename> struct allocator;
//
// struct Item {
// int waldo;
// };
//
// int main() {
// allocator<Item>::value_type item;
// item.waldo = 5;
// }
public void testRedeclarationWithUnnamedTemplateParameter_472199() throws Exception {
checkBindings();
}
// template<long _Ax> struct _GcdX {
// static const long value = _GcdX<_Ax - 1>::value;
// };
//
// template<> struct _GcdX<0> {
// static const long value = 0;
// };
//
// template<long _Ax> struct R {
// // static const long value = _Ax;
// };
//
// template<class _R1> struct Operation {
// static const long _N1 = _R1::value;
// typedef R<_GcdX<_N1>::value> value;
// };
//
// typedef Operation< R<1> >::value MYTYPE;
// // empty file
public void testRecursiveTemplateInstantiation_479138a() throws Exception {
// This tests that a template metaprogram whose termination depends on
// its inputs being known, doesn't cause a stack overflow when its
// inputs are not known.
checkBindings();
}
// template<long _Ax, long _Bx> struct _GcdX {
// static const long value = _GcdX<_Bx, _Ax % _Bx>::value;
// };
//
// template<long _Ax> struct _GcdX<_Ax, 0> {
// static const long value = _Ax;
// };
//
// template<long _Ax, long _Bx> struct _Gcd {
// static const long value = _GcdX<_Ax, _Bx>::value;
// };
//
// template<> struct _Gcd<0, 0> {
// static const long value = 1;
// };
//
// template<long _Ax> struct R {
// // static const long value = _Ax;
// };
//
// template<class _R1> struct Operation {
// static const long _N1 = _R1::value;
// typedef R<_Gcd<_N1, _N1>::value> value;
// };
//
//
// typedef Operation< R<1> >::value MYTYPE;
// // empty file
public void testRecursiveTemplateInstantiation_479138b() throws Exception {
// This is similar to 479138a, but the metaprogram additionally has
// exponential memory usage when the inputs are unknown and thus
// intermediate results cannot be collapsed into a single value.
checkBindings();
}
// template<long _Ax> struct _GcdX {
// static const long value = _GcdX<_Ax - 1>::value;
// };
//
// template<long _Ax> struct R {
// static const long value = _Ax;
// };
//
// template<class _R1> struct Operation {
// static const long _N1 = _R1::value;
// typedef R<_GcdX<_N1>::value> value;
// };
//
// typedef Operation< R<1> >::value MYTYPE;
// // empty file
// // special:allowRecursionBindings
public void testRecursiveTemplateInstantiation_479138c() throws Exception {
// This tests that a template metaprogram that doesn't terminate at all
// (e.g. because the author omitted a base case) doesn't cause a stack overflow.
checkBindings();
}
// template<int L> constexpr
// auto Bar(char const (&val)[L]) -> int {
// return 0;
// }
//
// template<int K>
// auto Foo() -> int;
//
// template<>
// auto Foo<Bar("")>() -> int {
// return 1;
// }
// // empty file
public void testStackOverflow_462764() throws Exception {
checkBindings();
}
// template <typename>
// struct base {
// constexpr base() {}
// };
//
// template <typename T>
// struct derived : base<T> {
// constexpr derived() : base<T>() {}
// };
// derived<int> waldo;
public void testSerializationOfUnknownConstructor_490475() throws Exception {
IASTName waldoName = findName("waldo", 5);
IVariable waldo = getBindingFromASTName("waldo", 5);
IType derivedInt = waldo.getType();
assertInstance(derivedInt, ICPPClassSpecialization.class);
ICPPClassType derived = ((ICPPClassSpecialization) derivedInt).getSpecializedBinding();
ICPPMethod constructor = ClassTypeHelper.getMethodInClass(derived, MethodKind.DEFAULT_CTOR);
assertInstance(constructor, ICPPConstructor.class);
// Trigger deserialization of constructor chain execution
((ICPPConstructor) constructor).getConstructorChainExecution(waldoName);
}
// template <typename F>
// struct S {
// F f;
// };
//
// template <typename F>
// auto foo(F f) -> decltype(S<F>{f});
// void bar() {
// foo([]{});
// }
public void testBracedInitList_490475() throws Exception {
checkBindings();
}
// struct Cat { void meow(); };
// struct Dog { void woof(); };
// template <typename T>
// Dog bar(T);
//
// template <typename T>
// auto foo(T t) -> decltype(bar(t));
//
// Cat bar(int);
//
// int main() {
// auto x = foo(0);
// x.woof();
// }
public void testUnqualifiedFunctionCallInTemplate_402498() throws Exception {
checkBindings();
}
// template<typename T> struct traits;
// template <typename> struct M;
//
// template<typename T>
// struct traits<M<T>> {
// typedef T type;
// };
//
// typedef traits<M<int>>::type waldo; // ERROR
public void testRegression_402498() throws Exception {
checkBindings();
}
// template <typename Iterator>
// struct iterator_traits {
// typedef typename Iterator::value_type value_type;
// };
//
// template <typename I>
// struct normal;
//
// template <typename T>
// struct normal<T*> {
// typedef T value_type;
// };
// template <class Iterator>
// struct iterator_value {
// typedef typename iterator_traits<Iterator>::value_type type;
// };
//
// template <typename BidiIter, typename RegexTraits = typename iterator_value<BidiIter>::type>
// struct regex_compiler;
//
// typedef normal<char*> Iter;
//
// typedef regex_compiler<Iter> sregex_compiler;
//
// template<typename Char>
// struct xpression_linker;
//
// template<typename BidiIter>
// struct matchable_ex {
// typedef BidiIter iterator_type;
// typedef typename iterator_value<iterator_type>::type char_type;
//
// void link(xpression_linker<char_type>);
// };
//
// template<typename BidiIter>
// struct sub_match {
// typedef typename iterator_value<BidiIter>::type value_type;
// operator value_type() const;
// };
//
// void waldo(char);
//
// void foo(sub_match<Iter> w) {
// waldo(w);
// }
public void testRegression_516338() throws Exception {
checkBindings();
}
// struct Foo {
// char value[1];
// constexpr Foo() : value{0} {
// value[0] = 0; // Indexer fails here.
// }
// };
// constexpr auto foo = Foo{};
// // empty file
public void testAssignmentToMemberArrayElement_514363() throws Exception {
checkBindings();
}
// template <typename>
// struct Outer {
// static struct {
// int field;
// } static_field;
// };
//
// auto waldo = Outer<int>::static_field;
// int x = waldo.field;
public void testSpecializationOfAnonymousClass_528456() throws Exception {
checkBindings();
}
// // empty file
// namespace std {
// template <class E>
// struct initializer_list {
// const E* array;
// int len;
// constexpr const E* begin() const { return array; }
// constexpr const E* end() const { return array + len; }
// };
// }
// template <typename Enum>
// struct QFlags {
// int i;
// constexpr QFlags(std::initializer_list<Enum> flags)
// : i(initializer_list_helper(flags.begin(), flags.end())) {}
// constexpr static int initializer_list_helper(const Enum* it, const Enum* end) {
// return it == end ? 0 : (int(*it) | initializer_list_helper(it + 1, end));
// }
// };
// enum Option {
// ShowMessageBox = 0x02,
// Log = 0x04
// };
// struct MessageFunctionPrivate {
// QFlags<Option> Options{ShowMessageBox, Log};
// };
public void testConstexprInitListConstructor_519091() throws Exception {
checkBindings();
}
// template <typename T> T&& declval();
//
// template <typename Value, typename Func,
// typename Requires = decltype(declval<Func>()(declval<Value>()))>
// void apply(Value, Func);
//
// template <typename T>
// void callInTemplateContext(int i) {
// return apply(i, [](int x) { return T(x); });
// }
//
// void consume(int);
// void callInCpp1(int i);
// void callInCpp1(int i) {
// apply(i, &consume);
// }
public void testClassCastException_533216() throws Exception {
checkBindings();
}
}