From 650a248bb48603eec1a8c671eeab4ee5fd1dceae Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Thu, 14 Jan 2010 17:35:22 -0800 Subject: [PATCH] Stricter operator overloading parsing. --- Cython/Compiler/Parsing.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index 8ae36650..9d0ffecb 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -2058,6 +2058,8 @@ def p_c_func_declarator(s, pos, ctx, base, cmethod_flag): exception_value = exc_val, exception_check = exc_check, nogil = nogil or ctx.nogil or with_gil, with_gil = with_gil) +supported_overloaded_operators = set(['+', '-', '*', '/', '%', '++', '--', '~', '<<', '>>' ]) + def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag, assignable, nonempty): pos = s.position() @@ -2102,13 +2104,21 @@ def p_c_simple_declarator(s, ctx, empty, is_type, cmethod_flag, if cname is None and ctx.namespace is not None: cname = ctx.namespace + "::" + name if name == 'operator' and ctx.visibility == 'extern': - # TODO: This needs to be more strict... - name += s.sy + op = s.sy + # Handle diphthong operators. + if op == '(': + s.expect(')') + op = '()' + elif op == '[': + s.expect(']') + op = '[]' s.next() - if name[-1] == s.sy: - # ++ and -- are parsed as two tokens - name += s.sy + if op in ['-', '+'] and s.sy == op: + op = op*2 s.next() + if op not in supported_overloaded_operators: + s.error("Overloading operator '%s' not yet supported." % op) + name = name+op result = Nodes.CNameDeclaratorNode(pos, name = name, cname = cname, default = rhs) result.calling_convention = calling_convention -- 2.26.2