/******************************************************************************* * 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); } }