From ad685d49beda8cb373580aecc285705a74d55b23 Mon Sep 17 00:00:00 2001 From: Lukas Rieger <0x53A@users.noreply.github.com> Date: Sat, 16 Sep 2017 08:02:49 +0200 Subject: [PATCH] Fix 1373: add checks for famANDassembly visibility (#2495) * add checks for famANDassembly visibility fixes https://github.com/Microsoft/visualfsharp/issues/1373 * add unit tests for FamAndAssembly / FamOrAssembly * disable failing test * adapt ut error message for error message rework * add issue link to disabled unit test * align and replace all tabs with whitespace (maybe build failure is related to tabs? I'm probably paranoid ....) * -a => --target:library * fix assembly * fix FamAndAssembly * manually modify accessibilities in AccessibilityTests.dll * Revert "-a => --target:library" This reverts commit 33af6458fc2839511e7b110b4b0c3922ff95fa4e. --- src/fsharp/AccessibilityLogic.fs | 10 +++++++++- .../Source/Import/AccessibilityTests.cs | 18 ++++++++++++++++++ .../Source/Import/AccessibilityTests.dll | Bin 0 -> 4608 bytes .../fsharpqa/Source/Import/FamAndAssembly.fs | 8 ++++++++ .../Source/Import/FamAndAssembly_NoIVT.fs | 8 ++++++++ tests/fsharpqa/Source/Import/FamOrAssembly.fs | 12 ++++++++++++ .../Source/Import/FamOrAssembly_NoIVT.fs | 12 ++++++++++++ tests/fsharpqa/Source/Import/env.lst | 9 +++++++++ 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tests/fsharpqa/Source/Import/AccessibilityTests.cs create mode 100644 tests/fsharpqa/Source/Import/AccessibilityTests.dll create mode 100644 tests/fsharpqa/Source/Import/FamAndAssembly.fs create mode 100644 tests/fsharpqa/Source/Import/FamAndAssembly_NoIVT.fs create mode 100644 tests/fsharpqa/Source/Import/FamOrAssembly.fs create mode 100644 tests/fsharpqa/Source/Import/FamOrAssembly_NoIVT.fs diff --git a/src/fsharp/AccessibilityLogic.fs b/src/fsharp/AccessibilityLogic.fs index ca267ce2f..6c4362d9a 100644 --- a/src/fsharp/AccessibilityLogic.fs +++ b/src/fsharp/AccessibilityLogic.fs @@ -90,7 +90,15 @@ let private IsILMemberAccessible g amap m (tcrefOfViewedItem : TyconRef) ad acce (access = ILMemberAccess.Assembly || access = ILMemberAccess.FamilyOrAssembly) && canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath - (access = ILMemberAccess.Public) || accessibleByFamily || accessibleByInternalsVisibleTo + let accessibleByFamilyAndAssembly = + access = ILMemberAccess.FamilyAndAssembly && + canAccessFromOneOf cpaths tcrefOfViewedItem.CompilationPath && + match tcrefViewedFromOption with + | None -> false + | Some tcrefViewedFrom -> + ExistsHeadTypeInEntireHierarchy g amap m (generalizedTyconRef tcrefViewedFrom) tcrefOfViewedItem + + (access = ILMemberAccess.Public) || accessibleByFamily || accessibleByInternalsVisibleTo || accessibleByFamilyAndAssembly | AccessibleFromSomewhere -> true diff --git a/tests/fsharpqa/Source/Import/AccessibilityTests.cs b/tests/fsharpqa/Source/Import/AccessibilityTests.cs new file mode 100644 index 000000000..e3df6a9fb --- /dev/null +++ b/tests/fsharpqa/Source/Import/AccessibilityTests.cs @@ -0,0 +1,18 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("FamAndAssembly")] +[assembly: InternalsVisibleTo("FamOrAssembly")] + + +public class Accessibility +{ + public int Public { get; set; } + private int Private { get; set; } + protected int Protected { get; set; } + internal int Internal { get; set; } + // Note: accessibility was modified using dnspy + public int FamOrAssembly { get; set; } + // Note: accessibility was modified using dnspy + public int FamAndAssembly { get; set; } +} + diff --git a/tests/fsharpqa/Source/Import/AccessibilityTests.dll b/tests/fsharpqa/Source/Import/AccessibilityTests.dll new file mode 100644 index 0000000000000000000000000000000000000000..0e01f245a7d15069221ccb8c6cc4561078833f20 GIT binary patch literal 4608 zcmeHKPiz!r6#vcacDpT

U5LmVrWOMAw=&Q6qtEDV3T+8(ND0VmrGXm(kgoW@cJi zL{m^n3?7W}z`+DP7%v(<7$qhe^y0yoc+jH>2X7v{7)^{3fA7s~w_8wyHw|C;e)Hb% z{rTSa=9``2@MEtc10c(J^(t_QR~bdczlUX-H*EW413ql|diy0~^y}@DC)~)I3xi5% zSFN(``$24#94nmnE!Ve(#wM(4FzXcB+FEy}smBijqecc>9v^wMw%Qf!*uKu_1zO4E z61LF8tHoL51U9N{CUpxT_3KzBl9!P|@g;GUfAwps3dQm5Zs52GMc|t>PSlk#1FT$VS%`M7mfA9WS7xnr7%D zxpd#WrlSZ9*5ulCqx6+SYBSM<%NDSy88C$W7o*F3mZ8}@cbJ*yR3O1p5<&$MJa7r2 z0ts#^AygpIR3lU%!DEnkq(TpCY{i`zoOpQ9NUN2-FZ36B3w^zP_dX!SXE8(E%w@Wt z2Nrq#nKg7z#G&g~BJuE;PukS|(6NyrUQbiMAo`#elz5fF5aal*ZyGJ4{I;tPok@R0 zr%jJ&TY6<#xPw#r$5eVhM3yO-TywY|`)U8xxXsMrK2z|R>6#rl&4f9eSLPkXFUaTc zJy9}j7SKEf>)uYeDbY8I@mVhEH6FF5*^<5<9S4`NvRHpMex5YDQ%{MPZgzK9iy_Z>s#3uJV@3 zmlZ!xQGBkb3`1(L6pM;8ipz>7cMZI4+)jK~@k7PW6u(sbjwpT^PLn88&P0|dPjoZo z9MR-#p`0h0oa-pJ5=~Ay59^89WiHe(eqaH7C|8DodlGq|Ty~FHJg892I6g z4|@*>v-6&_4-IxyqjC^>ZV6+hr=4<)iKQrZs@OX|U-I1YzGtSV2kr7Rd?<%q$D1V| zx(jyfT+a~1OyJC3YZ~!mC-iOaTFbCq9SaAd$f=gRrR$mp{Mo;>SDbh{sS{CMT(G@) z2Wm@dO^m6W@M)>3rKX9kR;!v;6tOhas^&%}^;uPL&1p4ND91sFwCc2(7!PYDtgP6W zo7(Cm4YyElF%AUPIoGpeH}H=-p1r72G!XL#wKN|)>3uC6o%dt6>J$=pC!BD?1()Xq zsX=&#CWogUJ>-<;D;2xsIdv{MDTN`|uJ}O|yX6Rp8xIT58gte*6HU21kDfCb)T3(! zJmmOJ$OAQ7Hziq|a4-x`MvZG;W15H=i|YG(9^PtSIP}KZTRJvv%^gMl<5N#eZRx-A zvYE?gEabD6VTfR4dXUe{qb8$Ee)T8K&f}pycO>u+E|#4+Y2f4uS=ne}Q2VX)ZkA^q zl4C=MfemYJ25vFX)_A*+l?aXB#rT!+`|cGHUGjdn>iTM__U>QJ0n-P9aLDrx+peEH zwvMAuws>9L#awH?DjK72YX9X9$Tx+4V=OoBLQXKy3%=?aMsn!n+wqYi5Sw*lZ1z)` z!UU#?2XU0r2*z-P`Ur8DvW!o&Km8%^_O)YwO31rsRa#|-hz7IT2${!)2ZuR*JcU5* zJN1ng%(1kF1R3Tv zA7|cxRn4>Zm}@n5p}v3V1^8_&JsaRoB6?Q2OOF*>{}{*6o8v}1U?u-Y>An9(18@5O HA3E?S>u)os literal 0 HcmV?d00001 diff --git a/tests/fsharpqa/Source/Import/FamAndAssembly.fs b/tests/fsharpqa/Source/Import/FamAndAssembly.fs new file mode 100644 index 000000000..50c621a50 --- /dev/null +++ b/tests/fsharpqa/Source/Import/FamAndAssembly.fs @@ -0,0 +1,8 @@ +// #Regression #NoMT #Import + +namespace NS + +type T() = + // note: the assembly 'Accessibility' has an IVT to this assembly + inherit Accessibility() + member x.Test() = base.FamAndAssembly diff --git a/tests/fsharpqa/Source/Import/FamAndAssembly_NoIVT.fs b/tests/fsharpqa/Source/Import/FamAndAssembly_NoIVT.fs new file mode 100644 index 000000000..cf4a42370 --- /dev/null +++ b/tests/fsharpqa/Source/Import/FamAndAssembly_NoIVT.fs @@ -0,0 +1,8 @@ +// #Regression #NoMT #Import +//The field, constructor or member 'FamAndAssembly' is not defined. +namespace NS + +type T() = + // note: the assembly 'Accessibility' does NOT have an IVT to this assembly, so it is expected to fail. + inherit Accessibility() + member x.Test() = base.FamAndAssembly diff --git a/tests/fsharpqa/Source/Import/FamOrAssembly.fs b/tests/fsharpqa/Source/Import/FamOrAssembly.fs new file mode 100644 index 000000000..99f782d5e --- /dev/null +++ b/tests/fsharpqa/Source/Import/FamOrAssembly.fs @@ -0,0 +1,12 @@ +// #Regression #NoMT #Import + +namespace NS + +// note: the assembly 'Accessibility' has an IVT to this assembly + +type T() = + inherit Accessibility() + member x.Test() = base.FamOrAssembly + +module M = + let Test() = Accessibility().FamOrAssembly diff --git a/tests/fsharpqa/Source/Import/FamOrAssembly_NoIVT.fs b/tests/fsharpqa/Source/Import/FamOrAssembly_NoIVT.fs new file mode 100644 index 000000000..e3bb98b76 --- /dev/null +++ b/tests/fsharpqa/Source/Import/FamOrAssembly_NoIVT.fs @@ -0,0 +1,12 @@ +// #Regression #NoMT #Import +//The member or object constructor 'FamOrAssembly' is not accessible. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions. +namespace NS + +// with FamOrAssembly, this should succeed, even though there is no IVT +type T() = + inherit Accessibility() + member x.Test() = base.FamOrAssembly + +module M = + // note: the assembly 'Accessibility' does NOT have an IVT to this assembly, so it is expected to fail. + let Test() = Accessibility().FamOrAssembly diff --git a/tests/fsharpqa/Source/Import/env.lst b/tests/fsharpqa/Source/Import/env.lst index 2e274f177..792c23a3a 100644 --- a/tests/fsharpqa/Source/Import/env.lst +++ b/tests/fsharpqa/Source/Import/env.lst @@ -80,6 +80,15 @@ NOMONO SOURCE=reference2.fsx SCFLAGS="--nologo -r:reference1.dll" PRECMD="\$FSC_ SOURCE=InternalsConsumer.fs SCFLAGS="-r:InternalsConsumer.CSAssembly.dll" PRECMD="\$CSC_PIPE /t:library InternalsConsumer.CSAssembly.cs" # InternalsConsumer.fs SOURCE=E_InternalsConsumer.fs SCFLAGS="-r:InternalsConsumer.CSAssembly.dll" PRECMD="\$CSC_PIPE /t:library InternalsConsumer.CSAssembly.cs" # E_InternalsConsumer.fs +### +### F# can consume FamOrAssembly and FamAndAssembly in combination with IVT +### + SOURCE=FamAndAssembly.fs SCFLAGS="-a -r:AccessibilityTests.dll" # FamAndAssembly.fs + ### See issue https://github.com/Microsoft/visualfsharp/issues/2496 + ### SOURCE=FamOrAssembly.fs SCFLAGS="-a -r:AccessibilityTests.dll" # FamOrAssembly.fs + SOURCE=FamAndAssembly_NoIVT.fs SCFLAGS="-a -r:AccessibilityTests.dll" # FamAndAssembly_NoIVT.fs + ### SOURCE=FamOrAssembly_NoIVT.fs SCFLAGS="-a -r:AccessibilityTests.dll" # FamOrAssembly_NoIVT.fs + ### ### Iterate over BCL collections ### -- GitLab