parent
12b365650f
commit
92c198c0a4
22
TestSuite/errors/err0400.pas
Normal file
22
TestSuite/errors/err0400.pas
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
type
|
||||||
|
TBase = class end;
|
||||||
|
|
||||||
|
TErr<T> = class(TBase)
|
||||||
|
|
||||||
|
public static function operator implicit(o: T): TErr<T>;
|
||||||
|
begin
|
||||||
|
raise new System.InvalidOperationException;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure p0<T>(o: TErr<T>) := exit;
|
||||||
|
|
||||||
|
// обязательно вызывать p0 с шаблонным параметром p1
|
||||||
|
// если вызывать p0&<word> - выводит правильное сообщение об ошибке
|
||||||
|
procedure p1<T>(q: TBase) := p0&<T>(q); // это не должно компилироваться
|
||||||
|
|
||||||
|
begin
|
||||||
|
var q: TBase;
|
||||||
|
p1&<byte>(q);
|
||||||
|
end.
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
begin
|
begin
|
||||||
var h1 := HSet(1,2,3);
|
var h1 := HSet(1,2,3);
|
||||||
var h2 := HSet(1,2,3);
|
var h2 := HSet(1,2,3);
|
||||||
assert(h1=h2);
|
assert(h1=h2);
|
||||||
|
|
@ -6,4 +6,10 @@ begin
|
||||||
h2 := HSet(1,2);
|
h2 := HSet(1,2);
|
||||||
assert(h1 > h2);
|
assert(h1 > h2);
|
||||||
assert(h2 < h1);
|
assert(h2 < h1);
|
||||||
|
h1 := [1,2,3];
|
||||||
|
h2 := [1,2,3];
|
||||||
|
assert(h1=h2);
|
||||||
|
h1 := HashSet&<integer>([1,2,3]);
|
||||||
|
h2 := HashSet&<integer>([1,2,3]);
|
||||||
|
assert(h1=h2);
|
||||||
end.
|
end.
|
||||||
30
TestSuite/implicitexplicit13.pas
Normal file
30
TestSuite/implicitexplicit13.pas
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
var i: integer;
|
||||||
|
type
|
||||||
|
|
||||||
|
TBase = class end;
|
||||||
|
|
||||||
|
TErr<T> = class(TBase)
|
||||||
|
|
||||||
|
public static function operator implicit(o: T): TErr<T>;
|
||||||
|
begin
|
||||||
|
i := 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
t1 = class(TErr<byte>) end;
|
||||||
|
|
||||||
|
// обязательно шаблонная подпрограмма и использование T ниже. Иначе не воспроизводится
|
||||||
|
procedure p1<T>;
|
||||||
|
begin
|
||||||
|
|
||||||
|
var a: TBase := new t1;
|
||||||
|
var b := TErr&<T>( a ); // тут вместо приведения типа вызывает operator implicit, который тут ну никак не подходит
|
||||||
|
// если удалить operator implicit - на этой строчке оказывается обычное приведение типа, как и должно
|
||||||
|
i := 2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
p1&<byte>;
|
||||||
|
assert(i = 2);
|
||||||
|
end.
|
||||||
|
|
@ -2387,6 +2387,8 @@ namespace PascalABCCompiler.TreeRealization
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (fn.parameters[0].type.is_generic_parameter)
|
||||||
|
continue;
|
||||||
return fn;
|
return fn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue