From 0d6aaec4935ddb4d1fc8fcf96e88f8a9eae1d44e Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 29 Jun 2010 00:48:49 -0700 Subject: [PATCH 1/3] Work-around and un-XFAIL generic-obj.rs test. The problem uncovered in the original XFAIL is more generally that of issue #92. --- src/Makefile | 1 - src/test/run-pass/generic-obj.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Makefile b/src/Makefile index 5a72afdeea9..31da01b16fd 100644 --- a/src/Makefile +++ b/src/Makefile @@ -325,7 +325,6 @@ TEST_XFAILS_X86 := test/run-pass/mlist-cycle.rs \ test/run-pass/vec-slice.rs \ test/run-pass/fn-lval.rs \ test/run-pass/generic-fn-infer.rs \ - test/run-pass/generic-obj.rs \ test/run-pass/generic-recursive-tag.rs \ test/run-pass/mutable-alias-vec.rs \ test/run-pass/mutable-vec-drop.rs \ diff --git a/src/test/run-pass/generic-obj.rs b/src/test/run-pass/generic-obj.rs index 414aaff46a2..1ff7d180a7f 100644 --- a/src/test/run-pass/generic-obj.rs +++ b/src/test/run-pass/generic-obj.rs @@ -11,7 +11,7 @@ obj buf[T](tup(T,T,T) data) { } } - fn take(T t) {} + fn take(&T t) {} } fn main() { From e692ccfb0c768658f13d3cf7887efd53e14f0416 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Tue, 29 Jun 2010 16:13:26 -0700 Subject: [PATCH 2/3] Add (XFAILed) testcase for typechecker issue where fns-in-mods appear to lose their type parameters over the course of the typechecking pass. --- src/Makefile | 2 ++ src/test/run-pass/generic-fn-twice.rs | 10 ++++++++++ 2 files changed, 12 insertions(+) create mode 100644 src/test/run-pass/generic-fn-twice.rs diff --git a/src/Makefile b/src/Makefile index 31da01b16fd..2c06b5f58c6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -325,6 +325,7 @@ TEST_XFAILS_X86 := test/run-pass/mlist-cycle.rs \ test/run-pass/vec-slice.rs \ test/run-pass/fn-lval.rs \ test/run-pass/generic-fn-infer.rs \ + test/run-pass/generic-fn-twice.rs \ test/run-pass/generic-recursive-tag.rs \ test/run-pass/mutable-alias-vec.rs \ test/run-pass/mutable-vec-drop.rs \ @@ -370,6 +371,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \ generic-drop-glue.rs \ generic-exterior-box.rs \ generic-fn-infer.rs \ + generic-fn-twice.rs \ generic-fn.rs \ generic-obj-with-derived-type.rs \ generic-obj.rs \ diff --git a/src/test/run-pass/generic-fn-twice.rs b/src/test/run-pass/generic-fn-twice.rs new file mode 100644 index 00000000000..0c6257f8874 --- /dev/null +++ b/src/test/run-pass/generic-fn-twice.rs @@ -0,0 +1,10 @@ +// -*- rust -*- + +mod foomod { + fn foo[T]() {} +} + +fn main() { + foomod.foo[int](); + foomod.foo[int](); +} From 5a07e98c5d8f61ff5d1efd28c36337a30d6e86d6 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 1 Jul 2010 00:09:11 -0700 Subject: [PATCH 3/3] Fix two bugs in tag patterns: 1. Look up the tag constructor function item using lval_item, not lval_to_referent; 2. Correct the form of the name used to query the tag or iso ty_tag when obtaining the corresponding type tuple. --- src/boot/me/resolve.ml | 2 +- src/boot/me/semant.ml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/boot/me/resolve.ml b/src/boot/me/resolve.ml index 1f563c76c63..cafb69b171e 100644 --- a/src/boot/me/resolve.ml +++ b/src/boot/me/resolve.ml @@ -930,7 +930,7 @@ let pattern_resolving_visitor Ast.PAT_tag (lval, pats) -> let lval_nm = lval_to_name lval in let lval_id = lval_base_id lval in - let tag_ctor_id = lval_to_referent cx lval_id in + let tag_ctor_id = (lval_item cx lval).id in if referent_is_item cx tag_ctor_id (* FIXME (issue #76): we should actually check here that the diff --git a/src/boot/me/semant.ml b/src/boot/me/semant.ml index 5160429ef50..95a5c792019 100644 --- a/src/boot/me/semant.ml +++ b/src/boot/me/semant.ml @@ -416,15 +416,15 @@ let fn_output_ty (fn_ty:Ast.ty) : Ast.ty = (* name of tag constructor function -> name for indexing in the ty_tag *) let rec tag_ctor_name_to_tag_name (name:Ast.name) : Ast.name = match name with - Ast.NAME_base nb -> - begin - match nb with - Ast.BASE_ident _ -> name - | Ast.BASE_app (id, _) -> Ast.NAME_base (Ast.BASE_ident id) - | _ -> - bug () "tag_or_iso_ty_tup_by_name with non-tag-ctor name" - end - | Ast.NAME_ext (inner_name, _) -> tag_ctor_name_to_tag_name inner_name + Ast.NAME_base (Ast.BASE_ident _) -> name + | Ast.NAME_base (Ast.BASE_app (id, _)) -> + Ast.NAME_base (Ast.BASE_ident id) + + | Ast.NAME_ext (_, Ast.COMP_ident id) + | Ast.NAME_ext (_, Ast.COMP_app (id, _)) -> + Ast.NAME_base (Ast.BASE_ident id) + + | _ -> bug () "tag_or_iso_ty_tup_by_name with non-tag-ctor name" ;; let tag_or_iso_ty_tup_by_name (ty:Ast.ty) (name:Ast.name) : Ast.ty_tup =