|
1 | 1 | # Note: testcases generated via `python -m cxxheaderparser.gentest` |
2 | 2 |
|
| 3 | +import pytest |
| 4 | + |
| 5 | +from cxxheaderparser.errors import CxxParseError |
3 | 6 | from cxxheaderparser.types import ( |
4 | 7 | Array, |
5 | 8 | BaseClass, |
@@ -1816,6 +1819,82 @@ class C { |
1816 | 1819 | ) |
1817 | 1820 |
|
1818 | 1821 |
|
| 1822 | +def test_template_function_instantiation() -> None: |
| 1823 | + content = """ |
| 1824 | + template <typename T> T tFunction(T val); |
| 1825 | + template <typename T> T tFunction(T val) { return val; } |
| 1826 | + template bool tFunction(bool val); |
| 1827 | + """ |
| 1828 | + data = parse_string(content, cleandoc=True) |
| 1829 | + |
| 1830 | + assert data == ParsedData( |
| 1831 | + namespace=NamespaceScope( |
| 1832 | + functions=[ |
| 1833 | + Function( |
| 1834 | + return_type=Type( |
| 1835 | + typename=PQName(segments=[NameSpecifier(name="T")]) |
| 1836 | + ), |
| 1837 | + name=PQName(segments=[NameSpecifier(name="tFunction")]), |
| 1838 | + parameters=[ |
| 1839 | + Parameter( |
| 1840 | + type=Type( |
| 1841 | + typename=PQName(segments=[NameSpecifier(name="T")]) |
| 1842 | + ), |
| 1843 | + name="val", |
| 1844 | + ) |
| 1845 | + ], |
| 1846 | + template=TemplateDecl( |
| 1847 | + params=[TemplateTypeParam(typekey="typename", name="T")] |
| 1848 | + ), |
| 1849 | + ), |
| 1850 | + Function( |
| 1851 | + return_type=Type( |
| 1852 | + typename=PQName(segments=[NameSpecifier(name="T")]) |
| 1853 | + ), |
| 1854 | + name=PQName(segments=[NameSpecifier(name="tFunction")]), |
| 1855 | + parameters=[ |
| 1856 | + Parameter( |
| 1857 | + type=Type( |
| 1858 | + typename=PQName(segments=[NameSpecifier(name="T")]) |
| 1859 | + ), |
| 1860 | + name="val", |
| 1861 | + ) |
| 1862 | + ], |
| 1863 | + has_body=True, |
| 1864 | + template=TemplateDecl( |
| 1865 | + params=[TemplateTypeParam(typekey="typename", name="T")] |
| 1866 | + ), |
| 1867 | + ), |
| 1868 | + Function( |
| 1869 | + return_type=Type( |
| 1870 | + typename=PQName(segments=[FundamentalSpecifier(name="bool")]) |
| 1871 | + ), |
| 1872 | + name=PQName(segments=[NameSpecifier(name="tFunction")]), |
| 1873 | + parameters=[ |
| 1874 | + Parameter( |
| 1875 | + type=Type( |
| 1876 | + typename=PQName( |
| 1877 | + segments=[FundamentalSpecifier(name="bool")] |
| 1878 | + ) |
| 1879 | + ), |
| 1880 | + name="val", |
| 1881 | + ) |
| 1882 | + ], |
| 1883 | + template=TemplateDecl(), |
| 1884 | + ), |
| 1885 | + ] |
| 1886 | + ) |
| 1887 | + ) |
| 1888 | + |
| 1889 | + |
| 1890 | +def test_template_rejects_variable_instantiation() -> None: |
| 1891 | + with pytest.raises(CxxParseError): |
| 1892 | + parse_string("template int x;") |
| 1893 | + |
| 1894 | + with pytest.raises(CxxParseError): |
| 1895 | + parse_string("template int (x);") |
| 1896 | + |
| 1897 | + |
1819 | 1898 | def test_template_instantiation() -> None: |
1820 | 1899 | content = """ |
1821 | 1900 | template class MyClass<1,2>; |
|
0 commit comments