diff options
author | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-13 21:08:38 +0000 |
---|---|---|
committer | svenbarth <svenbarth@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2019-06-13 21:08:38 +0000 |
commit | 7f0efac84af534fdae92548a02931706c20daec9 (patch) | |
tree | 920ff083b1e35c0bfa6bcb63d487a5b847e302e5 | |
parent | d0680f29e112864b4583ef34bec2a3a0e349ea65 (diff) | |
download | fpc-7f0efac84af534fdae92548a02931706c20daec9.tar.gz |
* fix for Mantis #35693: IsOrdinal also needs to return true for enums (with that AsOrdinal will work correctly as well)
* extended RTTI test by a test for enums
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@42219 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | packages/rtl-objpas/src/inc/rtti.pp | 2 | ||||
-rw-r--r-- | packages/rtl-objpas/tests/tests.rtti.pas | 20 |
2 files changed, 21 insertions, 1 deletions
diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp index 3ed2410a86..3ac3084105 100644 --- a/packages/rtl-objpas/src/inc/rtti.pp +++ b/packages/rtl-objpas/src/inc/rtti.pp @@ -1548,7 +1548,7 @@ end; function TValue.IsOrdinal: boolean; begin - result := (Kind in [tkInteger, tkInt64, tkQWord, tkBool]) or + result := (Kind in [tkInteger, tkInt64, tkQWord, tkBool, tkEnumeration]) or ((Kind in [tkClass, tkClassRef, tkInterfaceRaw, tkUnknown]) and not Assigned(FData.FAsPointer)); end; diff --git a/packages/rtl-objpas/tests/tests.rtti.pas b/packages/rtl-objpas/tests/tests.rtti.pas index 1a32e412f1..5c67f90073 100644 --- a/packages/rtl-objpas/tests/tests.rtti.pas +++ b/packages/rtl-objpas/tests/tests.rtti.pas @@ -60,6 +60,7 @@ type procedure TestMakeExtended; procedure TestMakeCurrency; procedure TestMakeComp; + procedure TestMakeEnum; procedure TestDataSize; procedure TestDataSizeEmpty; @@ -665,6 +666,25 @@ begin CheckFalse(hadexcept, 'Had unsigned type conversion exception'); end; +procedure TTestCase1.TestMakeEnum; +var + e: TTestEnum; + v: TValue; +begin + e := te1; + + TValue.Make(@e, TypeInfo(e), v); + Check(not v.IsClass); + Check(not v.IsArray); + Check(not v.IsEmpty); + Check(not v.IsOpenArray); + Check(not v.IsObject); + Check(v.IsOrdinal); + + Check(v.GetReferenceToRawData <> @e); + Check(TTestEnum(v.AsOrdinal) = te1); +end; + procedure TTestCase1.TestGetIsReadable; var c: TRttiContext; |