Jelajahi Sumber

fix cast + parenthesis parsing (closes #3806)

Simon Krajewski 10 tahun lalu
induk
melakukan
8970fea667
3 mengubah file dengan 26 tambahan dan 3 penghapusan
  1. 4 2
      parser.ml
  2. 1 1
      std/js/_std/Std.hx
  3. 21 0
      tests/unit/src/unit/issues/Issue3806.hx

+ 4 - 2
parser.ml

@@ -1145,10 +1145,12 @@ and expr = parser
 	| [< '(Kwd Null,p); s >] -> expr_next (EConst (Ident "null"),p) s
 	| [< '(Kwd Cast,p1); s >] ->
 		(match s with parser
-		| [< '(POpen,_); e = expr; s >] ->
+		| [< '(POpen,pp); e = expr; s >] ->
 			(match s with parser
 			| [< '(Comma,_); t = parse_complex_type; '(PClose,p2); s >] -> expr_next (ECast (e,Some t),punion p1 p2) s
-			| [< '(PClose,p2); s >] -> expr_next (ECast (e,None),punion p1 (pos e)) s
+			| [< '(PClose,p2); s >] ->
+				let ep = expr_next (EParenthesis(e),punion pp p2) s in
+				expr_next (ECast (ep,None),punion p1 (pos ep)) s
 			| [< >] -> serror())
 		| [< e = secure_expr >] -> expr_next (ECast (e,None),punion p1 (pos e)) s)
 	| [< '(Kwd Throw,p); e = expr >] -> (EThrow e,p)

+ 1 - 1
std/js/_std/Std.hx

@@ -37,7 +37,7 @@ import js.Boot;
 	}
 
 	public static inline function int( x : Float ) : Int {
-		return cast(x) | 0;
+		return (cast x) | 0;
 	}
 
 	public static function parseInt( x : String ) : Null<Int> {

+ 21 - 0
tests/unit/src/unit/issues/Issue3806.hx

@@ -0,0 +1,21 @@
+package unit.issues;
+
+private abstract Pointer<T>(Int) from Int {
+    @:op(A - B)
+	public static function subP<T>(lhs:Pointer<T>, rhs:Pointer<T>):Pointer<T> {
+		return lhs.value() - rhs.value();
+	}
+
+    public inline function value() {
+        return this;
+    }
+}
+
+class Issue3806 extends Test {
+	function test() {
+        var p:Pointer<Int> = 12;
+        var p2:Pointer<Int> = 5;
+		var i = (cast (p - p2).value());
+		eq(7, i);
+	}
+}