Commit 3f829d6a authored by Stefan Behnel's avatar Stefan Behnel

removed various invalid syntax combinations for the c(p)def statement (#280)

parent defbb401
...@@ -2068,31 +2068,30 @@ def p_cdef_statement(s, ctx): ...@@ -2068,31 +2068,30 @@ def p_cdef_statement(s, ctx):
elif s.sy == 'import': elif s.sy == 'import':
s.next() s.next()
return p_cdef_extern_block(s, pos, ctx) return p_cdef_extern_block(s, pos, ctx)
if p_nogil(s): elif p_nogil(s):
ctx.nogil = 1 ctx.nogil = 1
if s.sy == ':': if ctx.overridable:
error(pos, "cdef blocks cannot be declared cpdef")
return p_cdef_block(s, ctx)
elif s.sy == ':':
if ctx.overridable:
error(pos, "cdef blocks cannot be declared cpdef")
return p_cdef_block(s, ctx) return p_cdef_block(s, ctx)
elif s.sy == 'class': elif s.sy == 'class':
if ctx.level not in ('module', 'module_pxd'): if ctx.level not in ('module', 'module_pxd'):
error(pos, "Extension type definition not allowed here") error(pos, "Extension type definition not allowed here")
#if ctx.api: if ctx.overridable:
# error(pos, "'api' not allowed with extension class") error(pos, "Extension types cannot be declared cpdef")
return p_c_class_definition(s, pos, ctx) return p_c_class_definition(s, pos, ctx)
elif s.sy == 'IDENT' and s.systring in ("struct", "union", "enum", "packed"): elif s.sy == 'IDENT' and s.systring in ("struct", "union", "enum", "packed"):
if ctx.level not in ('module', 'module_pxd'): if ctx.level not in ('module', 'module_pxd'):
error(pos, "C struct/union/enum definition not allowed here") error(pos, "C struct/union/enum definition not allowed here")
#if ctx.visibility == 'public': if ctx.overridable:
# error(pos, "Public struct/union/enum definition not implemented") error(pos, "C struct/union/enum cannot be declared cpdef")
#if ctx.api:
# error(pos, "'api' not allowed with '%s'" % s.systring)
if s.systring == "enum": if s.systring == "enum":
return p_c_enum_definition(s, pos, ctx) return p_c_enum_definition(s, pos, ctx)
else: else:
return p_c_struct_or_union_definition(s, pos, ctx) return p_c_struct_or_union_definition(s, pos, ctx)
elif s.sy == 'pass':
node = p_pass_statement(s)
s.expect_newline('Expected a newline')
return node
else: else:
return p_c_func_or_var_declaration(s, pos, ctx) return p_c_func_or_var_declaration(s, pos, ctx)
...@@ -2100,6 +2099,8 @@ def p_cdef_block(s, ctx): ...@@ -2100,6 +2099,8 @@ def p_cdef_block(s, ctx):
return p_suite(s, ctx(cdef_flag = 1)) return p_suite(s, ctx(cdef_flag = 1))
def p_cdef_extern_block(s, pos, ctx): def p_cdef_extern_block(s, pos, ctx):
if ctx.overridable:
error(pos, "cdef extern blocks cannot be declared cpdef")
include_file = None include_file = None
s.expect('from') s.expect('from')
if s.sy == '*': if s.sy == '*':
......
cdef pass
cdef void
cdef nogil class test: pass
_ERRORS = u"""
2: 5: Expected an identifier, found 'pass'
3: 9: Empty declarator
4:11: Expected ':'
"""
cpdef nogil: pass
cpdef nogil class test: pass
_ERRORS = u"""
2: 6: cdef blocks cannot be declared cpdef
3: 6: cdef blocks cannot be declared cpdef
3:12: Expected ':'
"""
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment