Browse Source

* correct TValue.Cast<AnsiString>, patch by Евгений Савин. Fixes issue #41042

Michaël Van Canneyt 8 months ago
parent
commit
1b8209fee4

+ 7 - 2
packages/rtl-objpas/src/inc/rtti.pp

@@ -2862,7 +2862,7 @@ var
   RS : RawByteString;
   WS : WideString;
   SS : ShortString;
-
+  AStr: AnsiString;
 begin
   aRes:=False;
   US:=AsUnicodeString;
@@ -2894,6 +2894,11 @@ begin
     SetString(RS,PAnsiChar(US),Length(US));
     TValue.Make(@RS, aDestType, aDest);
     end;
+  tkAString:
+    begin
+    AStr := AnsiString(US);
+    TValue.Make(@AStr, aDestType, aDest);
+    end;
   tkWChar:
     begin
     if Length(US)<>1 then
@@ -2901,7 +2906,7 @@ begin
     TValue.Make(PWideChar(US),aDestType,aDest);
     end;
   else
-     // silence compiler warning
+    Exit;
   end;
   aRes:=True;
 end;

+ 4 - 0
packages/rtl-objpas/tests/tests.rtti.value.pas

@@ -1954,6 +1954,10 @@ begin
 {$endif}
   CheckTrue(Byte(397) = (TValue. specialize From<Integer>(397). specialize Cast<Byte>(). specialize AsType<Byte>), 'Byte(397) = (TValue.From<Integer>(397).Cast<Byte>().AsType<Byte>)');
   CheckTrue(32 = (TValue. specialize From<Byte>(32). specialize Cast<Integer>(). specialize AsType<Integer>), '32 = (TValue.From<Byte>(32).Cast<Integer>().AsType<Integer>)');
+
+  CheckTrue('test_str' = TValue.{$ifdef fpc}specialize{$endif} From<ShortString>('test_str')
+              .{$ifdef fpc}specialize{$endif} Cast<AnsiString>
+              .{$ifdef fpc}specialize{$endif} AsType<AnsiString>, 'TValue.From<shortring>.Cast<AnsiString> failed');
 end;