Ticket #552: cppclass_template_base.patch

File cppclass_template_base.patch, 5.3 KB (added by haoyu, 4 years ago)
  • Cython/Compiler/ExprNodes.py

    diff -r 37d40646533e Cython/Compiler/ExprNodes.py
    a b  
    575575        return src 
    576576 
    577577    def fail_assignment(self, dst_type): 
     578        print '...' 
     579        assert(0) 
    578580        error(self.pos, "Cannot assign type '%s' to '%s'" % (self.type, dst_type)) 
    579581 
    580582    def check_for_coercion_error(self, dst_type, fail=False, default=None): 
     
    59055907        func_type = entry.type 
    59065908        if func_type.is_ptr: 
    59075909            func_type = func_type.base_type 
    5908         if len(func_type.args) == 1: 
    5909             self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env) 
    5910         else: 
    5911             self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env) 
    5912             self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env) 
     5910        #if len(func_type.args) == 1: 
     5911            #self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env) 
     5912        #else: 
     5913            #self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env) 
     5914            #self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env) 
    59135915        self.type = func_type.return_type 
    59145916     
    59155917    def has_python_operands(self): 
  • Cython/Compiler/Nodes.py

    diff -r 37d40646533e Cython/Compiler/Nodes.py
    a b  
    10271027        if self.attributes is not None: 
    10281028            scope = CppClassScope(self.name, env) 
    10291029        base_class_types = [] 
    1030         for base_class_name in self.base_classes: 
    1031             base_class_entry = env.lookup(base_class_name) 
    1032             if base_class_entry is None: 
    1033                 error(self.pos, "'%s' not found" % base_class_name) 
    1034             elif not base_class_entry.is_type or not base_class_entry.type.is_cpp_class: 
     1030        for base_class in self.base_classes: 
     1031            base_class_type = base_class.analyse_as_type(env) 
     1032            if not base_class_type.is_cpp_class: 
    10351033                error(self.pos, "'%s' is not a cpp class type" % base_class_name) 
    10361034            else: 
    1037                 base_class_types.append(base_class_entry.type) 
     1035                base_class_types.append(base_class_type) 
    10381036        if self.templates is None: 
    10391037            template_types = None 
    10401038        else: 
  • Cython/Compiler/Parsing.py

    diff -r 37d40646533e Cython/Compiler/Parsing.py
    a b  
    26272627        templates = None 
    26282628    if s.sy == '(': 
    26292629        s.next() 
    2630         base_classes = [p_dotted_name(s, False)[2]] 
     2630        #base_classes = [p_dotted_name(s, False)[2]] 
     2631        base_classes = [p_c_base_type(s, templates = templates)] 
    26312632        while s.sy == ',': 
    26322633            s.next() 
    2633             base_classes.append(p_dotted_name(s, False)[2]) 
     2634            base_classes.append(p_c_base_type(s, templates=templates)) 
    26342635        s.expect(')') 
    26352636    else: 
    26362637        base_classes = [] 
  • Cython/Compiler/Symtab.py

    diff -r 37d40646533e Cython/Compiler/Symtab.py
    a b  
    15551555                        break 
    15561556                if not found: 
    15571557                    self.default_constructor = temp_entry.scope.name 
     1558                    #assert(0) 
    15581559                    error(pos, "no matching function for call to " \ 
    15591560                            "%s::%s()" % (temp_entry.scope.name, temp_entry.scope.name)) 
    15601561        elif not self.default_constructor: 
     
    15651566            cname = None, visibility = 'extern', defining = 0, 
    15661567            api = 0, in_pxd = 0, modifiers = ()): 
    15671568        if name == self.name.split('::')[-1] and cname is None: 
    1568             self.check_base_default_constructor(pos) 
     1569            #self.check_base_default_constructor(pos) 
    15691570            name = '<init>' 
    15701571            type.return_type = self.lookup(self.name).type 
    15711572        prev_entry = self.lookup_here(name) 
  • tests/run/cpp_templates.pyx

    diff -r 37d40646533e tests/run/cpp_templates.pyx
    a b  
    1414        bint operator==(Pair[T1,T2]) 
    1515        bint operator!=(Pair[T1,T2]) 
    1616 
     17    cdef cppclass InheritedWrap(Wrap[int]): 
     18        InheritedWrap(int) 
     19 
    1720def test_int(int x, int y): 
    1821    """ 
    1922    >>> test_int(3, 4) 
     
    2932    finally: 
    3033        del a, b 
    3134 
     35def test_inherit(int x, int y): 
     36    """ 
     37    >>> test_inherit(3, 4) 
     38    (3, 4, False) 
     39    >>> test_inherit(100, 100) 
     40    (100, 100, True) 
     41    """ 
     42    try: 
     43        a = new InheritedWrap(x) 
     44        b = new InheritedWrap(0) 
     45        b.set(y) 
     46        return a.get(), b.get() , a[0] == b[0] #  
     47    finally: 
     48        del a, b 
    3249 
    3350def test_double(double x, double y): 
    3451    """ 
  • tests/run/cpp_templates_helper.h

    diff -r 37d40646533e tests/run/cpp_templates_helper.h
    a b  
    2020    bool operator==(Pair<T1,T2> other) { return _first == other._first && _second == other._second; } 
    2121    bool operator!=(Pair<T1,T2> other) { return _first != other._first || _second != other._second; } 
    2222}; 
     23 
     24class InheritedWrap : public Wrap<int> { 
     25public: 
     26    InheritedWrap(int v) : Wrap<int>(v) {} 
     27}; 
     28