[mono-vb] VBNC30390 Compile Error
Rolf Bjarne Kvinge
rolflists at ya.com
Wed May 20 13:48:35 EDT 2009
Hi,
Thanks a lot for finding the bug and providing a patch, I committed the
patch in r134469.
Rolf
>
> On 05/15/2009 11:40 PM, John Lenz wrote:
> > 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 ;-)
> >>>
> > The following patch against mono-basic-2.4 fixes the problem for me.
> >
>
> The patch I just sent introduces a new error for code like
>
> Public Class Foo
> Public Class Bar
> Private Structure Baz
> Public Member As Integer
> End Structure
>
> Public Sub Test()
> Dim b As New Baz
> b.Member = 12
> End Sub
> End Class
> End Class
>
> (it needs three levels of nesting). I introduced the error because
> moving the check for IsNestedPrivate inside the loop removed the
> initial
> check since the hierarchy starts at CallerType.DeclaringType instead of
> CallerType.
>
> The following patch fixes the original problem and still works for the
> above example.
>
> Index: mono-basic-2.4/vbnc/vbnc/source/General/Helper.vb
> ===================================================================
> --- mono-basic-2.4.orig/vbnc/vbnc/source/General/Helper.vb 2009-05-16
> 00:04:57.000000000 -0500
> +++ mono-basic-2.4/vbnc/vbnc/source/General/Helper.vb 2009-05-16
> 00:20:51.000000000 -0500
> @@ -1981,8 +1981,14 @@
>
> '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)
> +
> + 'The caller can descend once into a private type, check if
> that is the case
> + If CalledType.IsNestedPrivate Then
> + 'don't fail here, because could be the private nesting is
> further up the hierarchy
> + If Helper.CompareType(CalledType.DeclaringType,
> CallerType) Then
> + Return True
> + End If
> + End If
>
> 'Add all the surrounding types of the caller type to a list.
> Dim callerHierarchy As New Generic.List(Of Type)
> @@ -1996,6 +2002,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 +2017,9 @@
> tmpCaller = tmpCaller.DeclaringType
> Loop
>
> + 'If the called type is a private nested type and the above
> checks failed, 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.
More information about the Mono-vb
mailing list