blob: 8f824880d25a379df77bbb89531d07faa8f0de06 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Institute for Software, HSR Hochschule fuer Technik
* Rapperswil, University of applied sciences.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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 abstract class IndexCPPVariableTemplateResolutionTest extends IndexBindingResolutionTestBase {
public static class SingleProjectTest extends IndexCPPVariableTemplateResolutionTest {
public SingleProjectTest() {
setStrategy(new SinglePDOMTestStrategy(true));
}
public static TestSuite suite() {
return suite(SingleProjectTest.class);
}
}
public static class ProjectWithDepProjTest extends IndexCPPVariableTemplateResolutionTest {
public ProjectWithDepProjTest() {
setStrategy(new ReferencedProject(true));
}
public static TestSuite suite() {
return suite(ProjectWithDepProjTest.class);
}
}
public static void addTests(TestSuite suite) {
suite.addTest(SingleProjectTest.suite());
suite.addTest(ProjectWithDepProjTest.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);
}
}