2
0
Эх сурвалжийг харах

follow beyond abstracts to transform TFor (closes #4809)

Simon Krajewski 9 жил өмнө
parent
commit
abfb5f7fb8

+ 1 - 1
src/generators/genhl.ml

@@ -2343,7 +2343,7 @@ and eval_expr ctx e =
 	| TMeta (_,e) ->
 		eval_expr ctx e
 	| TFor _ ->
-		assert false (* eliminated with pf_for_to_while *)
+		assert false (* eliminated by analyzer *)
 	| TSwitch (en,cases,def) ->
 		let rt = to_type ctx e.etype in
 		let r = alloc_tmp ctx rt in

+ 3 - 2
src/optimization/analyzer.ml

@@ -341,9 +341,10 @@ module TexprFilter = struct
 		| TFor(v,e1,e2) ->
 			let v' = alloc_var "tmp" e1.etype in
 			let ev' = mk (TLocal v') e1.etype e1.epos in
-			let ehasnext = mk (TField(ev',quick_field e1.etype "hasNext")) (tfun [] com.basic.tbool) e1.epos in
+			let t1 = (Abstract.follow_with_abstracts e1.etype) in
+			let ehasnext = mk (TField(ev',quick_field t1 "hasNext")) (tfun [] com.basic.tbool) e1.epos in
 			let ehasnext = mk (TCall(ehasnext,[])) com.basic.tbool ehasnext.epos in
-			let enext = mk (TField(ev',quick_field e1.etype "next")) (tfun [] v.v_type) e1.epos in
+			let enext = mk (TField(ev',quick_field t1 "next")) (tfun [] v.v_type) e1.epos in
 			let enext = mk (TCall(enext,[])) v.v_type e1.epos in
 			let eassign = mk (TVar(v,Some enext)) com.basic.tvoid e.epos in
 			let ebody = Type.concat eassign e2 in

+ 14 - 0
tests/unit/src/unit/issues/Issue4809.hx

@@ -0,0 +1,14 @@
+package unit.issues;
+
+private abstract Iter<T>(Iterator<T>) from Iterator<T> to Iterator<T> {}
+
+class Issue4809 extends Test {
+	function test() {
+		var list:Iter<Int> = [1, 2, 3].iterator();
+		var acc = "";
+		for (item in list) {
+			acc += item;
+		}
+		eq("123", acc);
+	}
+}