hephaestus-compiler-project / hephaestus

A framework for testing compilers' type checkers
https://hephaestus-compiler-project.github.io/
GNU General Public License v3.0
49 stars 10 forks source link

Known implementation bugs #10

Closed StefanosChaliasos closed 3 years ago

StefanosChaliasos commented 3 years ago

Right now, around 50 out of 1000 iterations fail.

open abstract class Foo() { open abstract fun buz(p: Sizzle): Number }

open class Bar(): Foo() { open override fun buz(p: Sizzle): Number = 10 }

- [ ] error: expecting ')' -- Missing constructor's name
```kotlin
  fun diagnosis(contrasts: Assertion<Char>, troopers: Roof<Tompkins>): Roof<Tompkins> 
{
    val faculties = Flexes("tanked")
    rifle()
    return (true, Tompkins(Flexes("graving"), faculties))
  }

open abstract class Foo() { open abstract fun buz(): Sizzle }

open abstract class Bar(): Foo() { open override fun buz() = Sizzle(4) }

* Kotlin errors (True Positives) -- Confirmed bugs that still crash frequently
    * `error: type mismatch: inferred type is Any but Long was expected`: nested ifs in return statement of a function.
    * `error: type mismatch: inferred type is Any but String was expected`: smart cast + function closure
* Program errors
- [x] TypeError: You cannot call 'is_subtype()' in an AbstractType

File \"check-type-system/src/transformations/parameterized.py\", line 376, in visit_field_decl node.field_type = self._use_type_parameter( File \"check-type-system/src/transformations/parameterized.py\", line 256, in _use_type_parameter tp.type_param = create_type_parameter( File \"check-type-system/src/transformations/parameterized.py\", line 48, in create_type_parameter bound = utils.random.choice(list(filter( File \"check-type-system/src/transformations/parameterized.py\", line 40, in bounds_filter if tparam.bound and not targ.is_subtype(tparam.bound): File \"check-type-system/src/ir/types.py\", line 45, in is_subtype raise TypeError(\"You cannot call 'is_subtype()' in an AbstractType\") TypeError: You cannot call 'is_subtype()' in an AbstractType

- [x] TypeError: You cannot call 'is_subtype()' in an AbstractType (Known problem in which we have type parameters as type arguments of a ParameterizedType

File \"/typesystems/check-type-system/src/transformations/substitution.py\", line 204, in visit_class_decl new_node = super().visit_class_decl(node) File \"/typesystems/check-type-system/src/ir/visitors.py\", line 145, in visit_class_decl return self._visit_node(node) File \"/typesystems/check-type-system/src/ir/visitors.py\", line 220, in _visit_node new_children.append(c.accept(self)) File \"/typesystems/check-type-system/src/ir/node.py\", line 4, in accept return visitor.visit(self) File \"/typesystems/check-type-system/src/ir/visitors.py\", line 42, in visit return visitor(node) File \"/typesystems/check-type-system/src/transformations/substitution.py\", line 313, in visit_func_decl transform = self._type_widening( File \"/typesystems/check-type-system/src/transformations/substitution.py\", line 173, in _type_widening superclasses = tu.find_supertypes(decl.get_type(), self.types, File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 77, in find_supertypes return _find_types(etype, types, get_subtypes=False, File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 58, in _find_types t_set.update(_construct_related_types(etype, types, get_subtypes)) File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 14, in _construct_related_types t_args = _find_types(etype.type_args[i], types, File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 58, in _find_types t_set.update(_construct_related_types(etype, types, get_subtypes)) File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 14, in _construct_related_types t_args = _find_types(etype.type_args[i], types, File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 65, in _find_types t_set = {st for st in t_set if st.is_subtype(bound)} File \"/typesystems/check-type-system/src/ir/type_utils.py\", line 65, in t_set = {st for st in t_set if st.is_subtype(bound)} File \"/typesystems/check-type-system/src/ir/types.py\", line 45, in is_subtype raise TypeError(\"You cannot call 'is_subtype()' in an AbstractType\") TypeError: You cannot call 'is_subtype()' in an AbstractType

- [ ] AttributeError: 'SimpleClassifier' object has no attribute 'type_args'

File \"check-type-system/src/transformations/substitution.py\", line 99, in visit_new return generate() File \"check-type-system/src/transformations/substitution.py\", line 98, in generate = generators.get(sub_c, lambda: self.generate_new(sub_c)) File \"check-type-system/src/transformations/substitution.py\", line 56, in generate_new return self._generate_new(class_decl, etype, params_map) File \"check-type-system/src/transformations/substitution.py\", line 41, in _generate_new args=[self.generator.generate_expr( File \"check-type-system/src/transformations/substitution.py\", line 41, in args=[self.generator.generate_expr( File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 454, in gen_new args.append(self.generate_expr( File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 454, in gen_new args.append(self.generate_expr( File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 445, in gen_new else {t_p: etype.type_args[i] File \"check-type-system/src/generators/generator.py\", line 445, in else {t_p: etype.type_args[i] AttributeError: 'SimpleClassifier' object has no attribute 'type_args'

- [ ] IndexError: list index out of range -- We must handle the case where return type is a TypeParameter

File \"check-type-system/src/transformations/substitution.py\", line 301, in visit_func_decl var_decl = self.generate_variable_declaration(\"ret\", File \"check-type-system/src/transformations/substitution.py\", line 217, in generate_variable_declaration expr = self.generator.generate_expr(etype, only_leaves=True) File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 439, in gen_new if etype2 == etype else self._get_subclass(etype)) File \"check-type-system/src/generators/generator.py\", line 422, in _get_subclass return ut.random.choice( File \"check-type-system/src/utils.py\", line 84, in choice return self.r.choice(choices) File \"/usr/lib/python3.9/random.py\", line 346, in choice return seq[self._randbelow(len(seq))] IndexError: list index out of range

- [x] IndexError: list index out of range

File \"check-type-system/src/transformations/substitution.py\", line 99, in visit_new return generate() File \"check-type-system/src/transformations/substitution.py\", line 98, in generate = generators.get(sub_c, lambda: self.generate_new(sub_c)) File \"check-type-system/src/transformations/substitution.py\", line 65, in generate_new return self._generate_new(class_decl, class_type, params_map) File \"check-type-system/src/transformations/substitution.py\", line 41, in _generate_new args=[self.generator.generate_expr( File \"check-type-system/src/transformations/substitution.py\", line 41, in args=[self.generator.generate_expr( File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 439, in gen_new if etype2 == etype else self._get_subclass(etype)) File \"check-type-system/src/generators/generator.py\", line 422, in _get_subclass return ut.random.choice( File \"check-type-system/src/utils.py\", line 84, in choice return self.r.choice(choices) File \"/usr/lib/python3.9/random.py\", line 346, in choice return seq[self._randbelow(len(seq))] IndexError: list index out of range

- [ ] IndexError: list index out of range

File \"check-type-system/src/transformations/type_creation.py\", line 205, in visit_program self._new_class = self.create_new_class(class_decl) File \"check-type-system/src/transformations/type_creation.py\", line 344, in create_new_class [self._create_super_instantiation(class_decl, class_type)], File \"check-type-system/src/transformations/type_creation.py\", line 286, in _create_super_instantiation args.append(self.generator.generate_expr( File \"check-type-system/src/generators/generator.py\", line 645, in generate_expr return ut.random.choice(gens)(expr_type) File \"check-type-system/src/generators/generator.py\", line 587, in lambda x: self.gen_new(x, only_leaves, subtype), File \"check-type-system/src/generators/generator.py\", line 439, in gen_new if etype2 == etype else self._get_subclass(etype)) File \"check-type-system/src/generators/generator.py\", line 422, in _get_subclass return ut.random.choice( File \"check-type-system/src/utils.py\", line 84, in choice return self.r.choice(choices) File \"/usr/lib/python3.9/random.py\", line 346, in choice return seq[self._randbelow(len(seq))] IndexError: list index out of range

- [x] IndexError: list index out of range

File \"/src/transformations/parameterized.py\", line 359, in visit_program node = self._analyse_selected_class(self._selected_class_decl) File \"/src/transformations/parameterized.py\", line 318, in _analyse_selected_class node = self._select_type_params(node) File \"/src/transformations/parameterized.py\", line 300, in _select_type_params node = self.visit_class_decl(node) File \"/src/transformations/base.py\", line 8, in inner new_node = visit(self, node) File \"/src/transformations/parameterized.py\", line 366, in visit_class_decl return super().visit_class_decl(node) File \"/src/ir/visitors.py\", line 145, in visit_class_decl return self._visit_node(node) File \"/src/ir/visitors.py\", line 220, in _visit_node new_children.append(c.accept(self)) File \"/src/ir/node.py\", line 4, in accept return visitor.visit(self) File \"/src/ir/visitors.py\", line 42, in visit return visitor(node) File \"/src/transformations/base.py\", line 8, in inner new_node = visit(self, node) File \"/src/transformations/parameterized.py\", line 414, in visit_func_decl new_node = super().visit_func_decl(node) File \"/src/ir/visitors.py\", line 160, in visit_func_decl return self._visit_node(node) File \"/src/ir/visitors.py\", line 220, in _visit_node new_children.append(c.accept(self)) File \"/src/ir/node.py\", line 4, in accept return visitor.visit(self) File \"/src/ir/visitors.py\", line 42, in visit return visitor(node) File \"/src/transformations/parameterized.py\", line 390, in visit_param_decl node.param_type = self._use_type_parameter( File \"/src/transformations/parameterized.py\", line 260, in _use_type_parameter tp.type_param = create_type_parameter( File \"/src/transformations/parameterized.py\", line 52, in create_type_parameter bound = utils.random.choice(list(filter( File \"/src/utils.py\", line 84, in choice return self.r.choice(choices) File \"/usr/lib/python3.9/random.py\", line 346, in choice return seq[self._randbelow(len(seq))] IndexError: list index out of range

- [x] TypeError: You cannot call 'is_subtype()' in an AbstractType (Known problem in which we have type parameters as type arguments of a ParameterizedType

File \"/src/transformations/substitution.py\", line 81, in visit_new subclasses = tu.find_subtypes(node.class_type, self.types) File \"/src/ir/type_utils.py\", line 71, in find_subtypes return _find_types(etype, types, get_subtypes=True, File \"/src/ir/type_utils.py\", line 58, in _find_types t_set.update(_construct_related_types(etype, types, get_subtypes)) File \"/src/ir/type_utils.py\", line 18, in _construct_related_types t_args = _find_types(etype.type_args[i], types, File \"/src/ir/type_utils.py\", line 58, in _find_types t_set.update(_construct_related_types(etype, types, get_subtypes)) File \"/src/ir/type_utils.py\", line 14, in _construct_related_types t_args = _find_types(etype.type_args[i], types, File \"/src/ir/type_utils.py\", line 65, in _find_types t_set = {st for st in t_set if st.is_subtype(bound)} File \"/src/ir/type_utils.py\", line 65, in t_set = {st for st in t_set if st.is_subtype(bound)} File \"/src/ir/types.py\", line 45, in is_subtype raise TypeError(\"You cannot call 'is_subtype()' in an AbstractType\") TypeError: You cannot call 'is_subtype()' in an AbstractType

StefanosChaliasos commented 3 years ago

Most of the errors have been solved. We'll keep track of the unsolved in #12.