C++, add support for user-defined literals

This commit is contained in:
Dean Moldovan 2015-10-12 13:39:19 +02:00
parent c823ffbcf1
commit 1021f4cdd7
3 changed files with 37 additions and 0 deletions

View File

@ -70,6 +70,7 @@ Bugs fixed
* C++, add support for final classes. * C++, add support for final classes.
* C++, fix parsing of types prefixed with 'enum'. * C++, fix parsing of types prefixed with 'enum'.
* #2023: Dutch search support uses Danish stemming info * #2023: Dutch search support uses Danish stemming info
* C++, add support for user-defined literals.
Documentation Documentation
------------- -------------

View File

@ -821,6 +821,31 @@ class ASTOperatorType(ASTBase):
signode += addnodes.desc_addname(identifier, identifier) signode += addnodes.desc_addname(identifier, identifier)
class ASTOperatorLiteral(ASTBase):
def __init__(self, identifier):
self.identifier = identifier
def is_operator(self):
return True
def get_id_v1(self):
raise NoOldIdError()
def get_id_v2(self):
return u'li' + self.identifier.get_id_v2()
def __unicode__(self):
return u'operator""' + text_type(self.identifier)
def describe_signature(self, signode, mode, env, prefix, symbol):
_verify_description_mode(mode)
identifier = text_type(self)
if mode == 'lastIsName':
signode += addnodes.desc_name(identifier, identifier)
else:
signode += addnodes.desc_addname(identifier, identifier)
class ASTTemplateArgConstant(ASTBase): class ASTTemplateArgConstant(ASTBase):
def __init__(self, value): def __init__(self, value):
self.value = value self.value = value
@ -2525,6 +2550,14 @@ class DefinitionParser(object):
op += '[]' op += '[]'
return ASTOperatorBuildIn(op) return ASTOperatorBuildIn(op)
# user-defined literal?
if self.skip_string('""'):
self.skip_ws()
if not self.match(_identifier_re):
self.fail("Expected user-defined literal suffix.")
identifier = ASTIdentifier(self.matched_text)
return ASTOperatorLiteral(identifier)
# oh well, looks like a cast operator definition. # oh well, looks like a cast operator definition.
# In that case, eat another type. # In that case, eat another type.
type = self._parse_type(named=False, outer="operatorCast") type = self._parse_type(named=False, outer="operatorCast")

View File

@ -347,6 +347,9 @@ def test_operators():
check('function', 'void operator ! ()', check('function', 'void operator ! ()',
"not-operator", "ntv", output='void operator!()') "not-operator", "ntv", output='void operator!()')
check('function', 'void operator "" _udl()',
None, 'li4_udlv', output='void operator""_udl()')
#def test_print(): #def test_print():
# # used for getting all the ids out for checking # # used for getting all the ids out for checking
# for a in ids: # for a in ids: