blob: 6d3f4569d01277aa7bb28c026519a12c8e621726 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences.
* 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:
* Lukas Wegmann (IFS) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.index.tests;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFieldTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariableInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariableTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariableTemplatePartialSpecialization;
import org.eclipse.cdt.core.index.IIndexBinding;
import junit.framework.TestSuite;
public class IndexCPPVariableTemplateResolutionTest extends IndexBindingResolutionTestBase {
public static class SingleProject extends IndexCPPVariableTemplateResolutionTest {
public SingleProject() {
setStrategy(new SinglePDOMTestStrategy(true));
}
public static TestSuite suite() {
return suite(SingleProject.class);
}
}
public static class ProjectWithDepProj extends IndexCPPVariableTemplateResolutionTest {
public ProjectWithDepProj() {
setStrategy(new ReferencedProject(true));
}
public static TestSuite suite() {
return suite(ProjectWithDepProj.class);
}
}
public static void addTests(TestSuite suite) {
suite.addTest(SingleProject.suite());
suite.addTest(ProjectWithDepProj.suite());
}
public IndexCPPVariableTemplateResolutionTest() {
setStrategy(new ReferencedProject(true));
}
// template<typename T> constexpr T pi = T(3);
// int f(){ return pi<int>; };
public void testVariableTemplateReference() {
checkBindings();
ICPPVariableTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfInt = getBindingFromASTName("pi<int>", 0);
assertEquals(pi, piOfInt.getSpecializedBinding());
}
// struct S {
// template<typename T> static constexpr T pi = T(3);
// };
// int f(){ return S::pi<int>; };
public void testFieldTemplateReference() {
checkBindings();
ICPPFieldTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfInt = getBindingFromASTName("pi<int>", 0);
assertEquals(pi, piOfInt.getSpecializedBinding());
}
// template<typename T> constexpr T pi = T(3);
// template constexpr int pi<int>;
// int f(){ return pi<int>; }
public void testExplicitVariableInstance() {
checkBindings();
ICPPVariableTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfInt =
getBindingFromASTName("pi<int>", 0, ICPPVariableInstance.class, IIndexBinding.class);
assertEquals(pi, piOfInt.getSpecializedBinding());
}
// struct S {
// template<typename T> static constexpr T pi = T(3);
// };
// template constexpr double S::pi<double>;
// double f(){ return S::pi<double>; }
public void testExplicitFieldInstance() {
checkBindings();
ICPPFieldTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfDouble = getBindingFromASTName("pi<double>", 0,
ICPPVariableInstance.class, ICPPField.class, IIndexBinding.class);
assertEquals(pi, piOfDouble.getSpecializedBinding());
}
// template<typename T> constexpr T pi = T(3);
// template<> constexpr int pi<int> = 4;
// int f(){ return pi<int>; }
public void testVariableSpecialization() {
checkBindings();
ICPPVariableTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfInt =
getBindingFromASTName("pi<int>", 0, ICPPVariableInstance.class, IIndexBinding.class);
assertEquals(pi, piOfInt.getSpecializedBinding());
}
// struct S {
// template<typename T> static constexpr T pi = T(3);
// };
// template<> constexpr double S::pi<double> = 4;
// double f(){ return S::pi<double>; }
public void testFieldSpecialization() {
checkBindings();
ICPPFieldTemplate pi = getBindingFromASTName("pi", 0);
ICPPVariableInstance piOfDouble = getBindingFromASTName("pi<double>", 0,
ICPPVariableInstance.class, ICPPField.class, IIndexBinding.class);
assertEquals(pi, piOfDouble.getSpecializedBinding());
}
// struct S {
// template<typename T> static constexpr T pi = T(3);
// };
// template<> constexpr double S::pi<double> = 4;
public void testFieldSpecializationInRef() {
checkBindings();
ICPPVariableInstance piOfDouble = getBindingFromASTName("pi<double>", 0,
ICPPVariableInstance.class, ICPPField.class);
}
// template<typename T, int I> T c = T(I);
// template<int I> float c<float, I> = float(I);
// float f() { return c<float, 100>; }
public void testVariableTemplatePartialSpecialization() {
checkBindings();
ICPPVariableTemplate c = getBindingFromASTName("c", 0);
ICPPVariableInstance cOfFloat = getBindingFromASTName("c<float, 100>", 0,
ICPPVariableInstance.class);
assertInstance(cOfFloat.getSpecializedBinding(),
ICPPVariableTemplatePartialSpecialization.class, IIndexBinding.class);
assertEquals(c,
((ICPPVariableTemplatePartialSpecialization) cOfFloat.getSpecializedBinding()).getPrimaryTemplate());
}
// template<typename T> T c = T(1);
// template<typename T> T* c<T*> = T(10);
// float f() { return c<int*>; }
public void testVariableTemplatePartialSpecialization2() {
checkBindings();
ICPPVariableTemplate c = getBindingFromASTName("c", 0);
ICPPVariableInstance cOfIntPtr = getBindingFromASTName("c<int*>", 0,
ICPPVariableInstance.class);
assertInstance(cOfIntPtr.getSpecializedBinding(),
ICPPVariableTemplatePartialSpecialization.class, IIndexBinding.class);
assertEquals(c,
((ICPPVariableTemplatePartialSpecialization) cOfIntPtr.getSpecializedBinding()).getPrimaryTemplate());
}
// struct S {
// template<typename T, int I> static constexpr T c = T(I);
// };
// template<int I> constexpr float S::c<float, I> = float(I);
// float f() { return S::c<float, 100>; }
public void testFieldTemplatePartialSpecialization() {
checkBindings();
ICPPVariableTemplate c = getBindingFromASTName("c", 0);
ICPPVariableInstance cOfIntPtr = getBindingFromASTName("c<float, 100>", 0,
ICPPVariableInstance.class, ICPPField.class);
assertInstance(cOfIntPtr.getSpecializedBinding(),
ICPPVariableTemplatePartialSpecialization.class, IIndexBinding.class, ICPPField.class);
assertEquals(c.getClass(),
((ICPPVariableTemplatePartialSpecialization) cOfIntPtr.getSpecializedBinding()).getPrimaryTemplate().getClass());
}
// template <typename T>
// constexpr bool templ = true;
// struct A {};
// constexpr bool waldo = templ<A>;
public void testStorageOfUninstantiatedValue_bug486671() {
checkBindings();
IVariable waldo = getBindingFromASTName("waldo", 5);
assertVariableValue(waldo, 1);
}
}