[m-rev.] diff: fix bug in error messages
Mark Brown
mark at cs.mu.OZ.AU
Thu May 19 14:35:48 AEST 2005
On 19-May-2005, Julien Fischer <juliensf at cs.mu.OZ.AU> wrote:
>
> On Sun, 8 May 2005, Mark Brown wrote:
>
> > Hi,
> >
> > This fixes a bug that was reported by Rob Moss a while ago.
> >
> > Cheers,
> > Mark.
> >
> > Estimated hours taken: 0.5
> > Branches: main, release
> >
> > compiler/module_qual.m:
> > Check for variables used as constructors when module qualifying types
> > and insts. In both cases this is currently illegal, so we report a
> > more sensible error message than we would otherwise get.
> >
> > compiler/prog_type.m:
> > Export a test to check if a type uses a variable as a constructor.
> >
> > tests/invalid/Mmakefile:
> > tests/invalid/kind.err_exp:
> > tests/invalid/kind.m:
> > Test case.
> >
>
> This change has broken code like that in the attached example where
> we define a type like the following:
>
> :- type '' ---> ''.
>
> and then try to use it.
Hmm. It also "breaks" the following code:
:- type ''(T) ---> f(T).
:- func bar(int) = ''(int).
bar(N) = f(N).
But this code should be illegal, since according to the reference manual:
| A higher-order term is equivalent to a simple compound term whose functor
| is the empty name, and whose arguments are the closure term followed by
| the argument terms of the higher-order term.
therefore the definition of baz is equivalent to:
:- func baz(int) = int.
baz(N) = g(N).
which is a type error.
It also breaks:
:- type ''(T, U) ---> g(T, U).
:- func baz(int) = ''(int, int).
baz(N) = g(N, N).
Here the definition of baz is equivalent to:
:- func baz(int) = int(int).
baz(N) = g(N, N).
which doesn't make sense at all.
(Note that the error reported for the bar/1 case is wrong, since the
compiler objects to the type expression ''(int) but does not object to
the type definition for ''(T). The error message for baz/1 is okay.)
So the question is, should
:- type '' ---> ''.
be legal? In value expressions the term '' is a builtin that is is
equivalent to 'apply', since it takes the first (higher-order) argument
and applies the remaining arguments. When we have higher order types
(i.e. constructor classes, etc), the type expression '' should be the
type equivalent of 'apply'.
So I think the answer to the question is no, the above type should not
be legal, and the funny_type test case should be changed or removed.
Are there any dissenting views? If not, I shall look into fixing the
errors that are reported, and also clarifying the reference manual.
Cheers,
Mark.
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list