Преглед на файлове

only eliminate sequential casts with the same type (#8764)

Aleksandr Kuzmenko преди 6 години
родител
ревизия
f505c250a7
променени са 2 файла, в които са добавени 25 реда и са изтрити 9 реда
  1. 12 9
      src/core/texpr.ml
  2. 13 0
      tests/unit/src/unit/issues/Issue8764.hx

+ 12 - 9
src/core/texpr.ml

@@ -541,15 +541,18 @@ let collect_captured_vars e =
 	In other cases return `e` as-is.
 *)
 let reduce_unsafe_casts ?(require_cast=false) e t =
-	let t = follow t in
-	let same_type etype = fast_eq t (follow etype) in
-	let rec loop e result =
+	let same_type t1 t2 =
+		fast_eq (follow_without_null t1) (follow_without_null t2)
+	in
+	let rec loop e =
 		match e.eexpr with
 		| TCast(subject,None) ->
-			if same_type e.etype then loop subject e
-			else loop subject result
-		| _ ->
-			if not require_cast && same_type e.etype then e
-			else result
+			let result = loop subject in
+			if same_type e.etype subject.etype then result
+			else { e with eexpr = TCast(result,None) }
+		| _ -> e
 	in
-	loop e e
+	match loop e with
+	| { eexpr = TCast _ } as result -> result
+	| result when require_cast -> { e with eexpr = TCast(result,None) }
+	| result -> result

+ 13 - 0
tests/unit/src/unit/issues/Issue8764.hx

@@ -0,0 +1,13 @@
+package unit.issues;
+
+class Issue8764 extends unit.Test {
+#if (static && !jvm)
+	function test() {
+		eq(0.0, foo());
+	}
+
+	static function foo(?e:Float):Null<Single> {
+		return (e:Float);
+	}
+#end
+}