Commit 931de505 authored by Xavier Thompson's avatar Xavier Thompson

Raise an compilation error when a cypclass inherits a data member from more than one path

parent 9631aff9
...@@ -383,6 +383,7 @@ def inject_acthon_interfaces(self): ...@@ -383,6 +383,7 @@ def inject_acthon_interfaces(self):
global acthon_result_type, acthon_message_type, acthon_sync_type, acthon_queue_type, acthon_activable_type global acthon_result_type, acthon_message_type, acthon_sync_type, acthon_queue_type, acthon_activable_type
def init_scope(scope): def init_scope(scope):
scope.is_cpp_class_scope = 1 scope.is_cpp_class_scope = 1
scope.is_cyp_class_scope = 1
scope.inherited_var_entries = [] scope.inherited_var_entries = []
scope.inherited_type_entries = [] scope.inherited_type_entries = []
......
...@@ -1543,6 +1543,7 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode): ...@@ -1543,6 +1543,7 @@ class CppClassNode(CStructOrUnionDefNode, BlockNode):
if self.scope is None and self.attributes is not None: if self.scope is None and self.attributes is not None:
scope = CppClassScope(self.name, env, templates=template_names) scope = CppClassScope(self.name, env, templates=template_names)
scope.is_cyp_class_scope = self.cypclass
self.scope = scope self.scope = scope
scope = self.scope scope = self.scope
......
...@@ -501,7 +501,7 @@ class Scope(object): ...@@ -501,7 +501,7 @@ class Scope(object):
# If we're not in a cypclass, any inherited method is visible # If we're not in a cypclass, any inherited method is visible
# until overloaded by a method with the same signature # until overloaded by a method with the same signature
if not (self.type and self.type.is_cyp_class): if not self.is_cyp_class_scope:
if alt_entry.is_inherited: if alt_entry.is_inherited:
previous_alternative_indices.append(index) previous_alternative_indices.append(index)
cpp_override_allowed = True cpp_override_allowed = True
...@@ -517,8 +517,16 @@ class Scope(object): ...@@ -517,8 +517,16 @@ class Scope(object):
if cpp_override_allowed: if cpp_override_allowed:
# C++ function/method overrides with different signatures are ok. # C++ function/method overrides with different signatures are ok.
pass pass
elif self.is_cpp_class_scope and entries[name].is_inherited: elif self.is_cpp_class_scope and old_entry.is_inherited:
# Likewise ignore inherited methods with identical signatures # Likewise allow redeclaration of inherited cpp attributes
if self.is_cyp_class_scope and not (old_entry.is_cfunction or old_entry.is_type):
# Except for cypclass member variables
error(pos, "Cypclass data member '%s' is inherited more than once by cypclass '%s'."
% (name, self.name))
old_entry.already_declared_here()
cypclass_entry = self.outer_scope.lookup(self.name)
if cypclass_entry:
error(cypclass_entry.pos, "Cypclass '%s' is declared here." % self.name)
pass pass
elif visibility == 'extern': elif visibility == 'extern':
# Silenced outside of "cdef extern" blocks, until we have a safe way to # Silenced outside of "cdef extern" blocks, until we have a safe way to
...@@ -526,7 +534,7 @@ class Scope(object): ...@@ -526,7 +534,7 @@ class Scope(object):
warning(pos, "'%s' redeclared " % name, 1 if self.in_cinclude else 0) warning(pos, "'%s' redeclared " % name, 1 if self.in_cinclude else 0)
elif visibility != 'ignore': elif visibility != 'ignore':
error(pos, "'%s' redeclared " % name) error(pos, "'%s' redeclared " % name)
entries[name].already_declared_here() old_entry.already_declared_here()
entry = Entry(name, cname, type, pos = pos) entry = Entry(name, cname, type, pos = pos)
entry.in_cinclude = self.in_cinclude entry.in_cinclude = self.in_cinclude
entry.create_wrapper = create_wrapper entry.create_wrapper = create_wrapper
...@@ -2547,6 +2555,7 @@ class CppClassScope(Scope): ...@@ -2547,6 +2555,7 @@ class CppClassScope(Scope):
# Namespace of a C++ class. # Namespace of a C++ class.
is_cpp_class_scope = 1 is_cpp_class_scope = 1
is_cyp_class_scope = 0
default_constructor = None default_constructor = None
type = None type = None
...@@ -2859,7 +2868,7 @@ class CppClassScope(Scope): ...@@ -2859,7 +2868,7 @@ class CppClassScope(Scope):
if base_entry.name in self.entries: if base_entry.name in self.entries:
base_entry.name # FIXME: is there anything to do in this case? base_entry.name # FIXME: is there anything to do in this case?
entry = self.declare(base_entry.name, base_entry.cname, entry = self.declare(base_entry.name, base_entry.cname,
base_entry_type, None, 'extern') base_entry_type, base_entry.pos, 'extern')
entry.is_variable = 1 entry.is_variable = 1
entry.is_inherited = 1 entry.is_inherited = 1
entry.is_cfunction = base_entry.is_cfunction entry.is_cfunction = base_entry.is_cfunction
......
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