[mono-vb] VBNC30390 Compile Error

John Lenz jlenz2 at math.uiuc.edu
Sat May 16 00:40:17 EDT 2009


On 04/17/2009 09:25 AM, John Lenz wrote:
> On 04/17/2009 03:09 AM, Rolf Bjarne Kvinge wrote:
>> Hi,
>>
>>> When attempting to compile a large vb.net project here at work with
>>> mono, I got a really weird error.  I was able to strip it down to the
>>> attached file, the error comes about when there are two private
>>> subclasses of some class.
>>>
>>> I am using the mono-basic code from Mono 2.4, and I get the following
>>> error.   The file compiles without errors in Visual Studio.  As I
>>> mention
>>> in the comment, changing Bar to a public class makes the file compile
>>> without any errors.
>>>
>>>
>>> Visual Basic.Net Compiler version 0.0.0.5914 (Mono 2.4 - r) Copyright
>>> (C) 2004-2008 Rolf Bjarne Kvinge. All rights reserved.
>>>
>>> /home/john/test.vb (28,26) : Error VBNC30390: 'Bar.Testing' is not
>> accessible because it is 'Public'.
>>
>> Yes, this is really weird.
>>
>> However you seem to have forgotten to attach the file ;-)
>>
> 
> I attached it, but maybe the list killed the attachment.  Here it is inline
> 
> Option Strict On
> 
> Public Class Foo
> 
>   'Changing Bar to a public class fixes the problem
>   Private Class Bar
>     Public Function Testing() As Integer
>           Return 12
>     End Function
>   End Class
> 
>   Private b As Bar
> 
>   Public Sub New()
>     b = New Bar()
>   End Sub
> 
> 
>   Private Class Baz
> 
>      Private parent As Foo
> 
>      Public Sub New(ByVal p As Foo)
>         parent = p
>      End Sub
> 
>      Public Function Test(ByVal i As Integer) As Integer
>          Return parent.b.Testing() + i
>      End Function
> 
>   End Class
> 
>   Public Function Test(ByVal i As Integer) As Integer
>       Dim b As New Baz(Me)
>       return b.Test(i)
>   End Function
> End Class


The following patch against mono-basic-2.4 fixes the problem for me.

Index: mono-basic-2.4/vbnc/vbnc/source/General/Helper.vb
===================================================================
--- mono-basic-2.4.orig/vbnc/vbnc/source/General/Helper.vb	2009-05-15 23:33:04.000000000 -0500
+++ mono-basic-2.4/vbnc/vbnc/source/General/Helper.vb	2009-05-15 23:30:28.000000000 -0500
@@ -1981,8 +1981,6 @@

         'If the called type is not a nested type it is accessible.
         If CalledType.DeclaringType Is Nothing Then Return True
-        'If the called type is a private nested type it is inaccessible
-        If CalledType.IsNestedPrivate Then Return Helper.CompareType(CalledType.DeclaringType, CallerType)

         'Add all the surrounding types of the caller type to a list.
         Dim callerHierarchy As New Generic.List(Of Type)
@@ -1996,6 +1994,10 @@
         Do Until tmpCaller Is Nothing
             If callerHierarchy.Contains(tmpCaller) Then
                 'We've reached a common surrounding type.
+
+                'The caller can descend once into a private type, check that here.
+                If CalledType.IsNestedPrivate Then Return Helper.CompareType(CalledType.DeclaringType, tmpCaller)
+
                 'No matter what accessibility level this type has
                 'it is accessible.
                 Return True
@@ -2007,6 +2009,9 @@
             tmpCaller = tmpCaller.DeclaringType
         Loop

+        'If the called type is a private nested type it is inaccessible
+        If CalledType.IsNestedPrivate Then Return Helper.CompareType(CalledType.DeclaringType, CallerType)
+
         'There is no common surrounding type, and the access level of all
         'surrounding types of the called types are non-private, so the type
         'is accessible.
@@ -4023,4 +4028,4 @@
         End Select
         Return False
     End Function
-End Class
\ No newline at end of file
+End Class


More information about the Mono-vb mailing list