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