C++, add proper template introduction mangling

This commit is contained in:
Jakob Lykke Andersen 2016-08-07 21:55:58 +02:00
parent 611ac9782a
commit 54dd5c5fd1
2 changed files with 28 additions and 14 deletions

View File

@ -869,6 +869,14 @@ class ASTTemplateIntroductionParameter(ASTBase):
else:
return '0' # we need to put something
def get_id_v2_as_arg(self):
# used for the implicit requires clause
res = self.identifier.get_id_v2()
if self.parameterPack:
return u'sp' + res
else:
return res
def __unicode__(self):
res = []
if self.parameterPack:
@ -897,8 +905,14 @@ class ASTTemplateIntroduction(ASTBase):
for param in self.params:
res.append(param.get_id_v2())
res.append("E")
# TODO: add stuff for the implicit requires clause
res.append("MissingRequiresMangling")
# let's use X expr E, which is otherwise for constant template args
res.append("X")
res.append(self.concept.get_id_v2())
res.append("I")
for param in self.params:
res.append(param.get_id_v2_as_arg())
res.append("E")
res.append("E")
return ''.join(res)
def __unicode__(self):

View File

@ -422,31 +422,31 @@ def test_templates():
raises(DefinitionError, parse, 'enum', 'abc::ns::foo{id_0, id_1, id_2} A')
raises(DefinitionError, parse, 'enumerator', 'abc::ns::foo{id_0, id_1, id_2} A')
check('class', 'abc::ns::foo{id_0, id_1, id_2} xyz::bar',
None, 'I000EMissingRequiresManglingN3xyz3barE')
None, 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE')
check('class', 'abc::ns::foo{id_0, id_1, ...id_2} xyz::bar',
None, 'I00DpEMissingRequiresManglingN3xyz3barE')
None, 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE')
check('class', 'abc::ns::foo{id_0, id_1, id_2} xyz::bar<id_0, id_1, id_2>',
None, 'I000EMissingRequiresManglingN3xyz3barI4id_04id_14id_2EE')
None, 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barI4id_04id_14id_2EE')
check('class', 'abc::ns::foo{id_0, id_1, ...id_2} xyz::bar<id_0, id_1, id_2...>',
None, 'I00DpEMissingRequiresManglingN3xyz3barI4id_04id_1Dp4id_2EE')
None, 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barI4id_04id_1Dp4id_2EE')
check('class', 'template<> Concept{U} A<int>::B',
None, 'IEI0EMissingRequiresManglingN1AIiE1BE')
None, 'IEI0EX7ConceptI1UEEN1AIiE1BE')
check('type', 'abc::ns::foo{id_0, id_1, id_2} xyz::bar = ghi::qux',
None, 'I000EMissingRequiresManglingN3xyz3barE')
None, 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE')
check('type', 'abc::ns::foo{id_0, id_1, ...id_2} xyz::bar = ghi::qux',
None, 'I00DpEMissingRequiresManglingN3xyz3barE')
None, 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE')
check('function', 'abc::ns::foo{id_0, id_1, id_2} void xyz::bar()',
None, 'I000EMissingRequiresManglingN3xyz3barEv')
None, 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barEv')
check('function', 'abc::ns::foo{id_0, id_1, ...id_2} void xyz::bar()',
None, 'I00DpEMissingRequiresManglingN3xyz3barEv')
None, 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barEv')
check('member', 'abc::ns::foo{id_0, id_1, id_2} ghi::qux xyz::bar',
None, 'I000EMissingRequiresManglingN3xyz3barE')
None, 'I000EXN3abc2ns3fooEI4id_04id_14id_2EEN3xyz3barE')
check('member', 'abc::ns::foo{id_0, id_1, ...id_2} ghi::qux xyz::bar',
None, 'I00DpEMissingRequiresManglingN3xyz3barE')
None, 'I00DpEXN3abc2ns3fooEI4id_04id_1sp4id_2EEN3xyz3barE')
check('concept', 'Iterator{T, U} Another',
None, 'I00EMissingRequiresMangling7Another')
None, 'I00EX8IteratorI1T1UEE7Another')
check('concept', 'template<typename ...Pack> Numerics = (... && Numeric<Pack>)',
None, 'IDpE8Numerics')