bugfix: compiler rejects methods without object parameter

This commit is contained in:
Araq
2011-01-06 09:06:43 +01:00
parent da325bc7a4
commit 27bc9296d1
7 changed files with 28 additions and 3 deletions

View File

@@ -17,9 +17,6 @@ proc methodCall*(n: PNode): PNode
proc generateMethodDispatchers*(): PNode
# implementation
const
skipPtrs = {tyVar, tyPtr, tyRef, tyGenericInst}
proc genConv(n: PNode, d: PType, downcast: bool): PNode =
var
dest, source: PType

View File

@@ -107,6 +107,7 @@ type
errArrayExpectsTwoTypeParams, errInvalidVisibilityX, errInitHereNotAllowed,
errXCannotBeAssignedTo, errIteratorNotAllowed, errXNeedsReturnType,
errInvalidCommandX, errXOnlyAtModuleScope,
errXNeedsParamObjectType,
errTemplateInstantiationTooNested, errInstantiationFrom,
errInvalidIndexValueForTuple, errCommandExpectsFilename, errXExpected,
errInvalidSectionStart, errGridTableNotImplemented, errGeneralParseError,
@@ -233,6 +234,7 @@ const
"iterators can only be defined at the module\'s top level",
"$1 needs a return type", "invalid command: \'$1\'",
"\'$1\' is only allowed at top level",
"'$1' needs a parameter that has an object type",
"template/macro instantiation too nested", "instantiation from here",
"invalid index value for tuple subscript",
"command expects a filename argument", "\'$1\' expected",

View File

@@ -754,6 +754,20 @@ proc semProc(c: PContext, n: PNode): PNode =
proc semMethod(c: PContext, n: PNode): PNode =
if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "method")
result = semProcAux(c, n, skMethod, methodPragmas)
var s = result.sons[namePos].sym
var t = s.typ
var hasObjParam = false
for col in countup(1, sonsLen(t)-1):
if skipTypes(t.sons[col], skipPtrs).kind == tyObject:
hasObjParam = true
break
# XXX this not really correct way to do it: Perhaps it should be done after
# generic instantiation. Well it's good enough for now:
if not hasObjParam:
liMessage(n.info, errXNeedsParamObjectType, "method")
proc semConverterDef(c: PContext, n: PNode): PNode =
if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "converter")

View File

@@ -56,6 +56,8 @@ const
abstractVarRange* = {tyGenericInst, tyRange, tyVar, tyDistinct, tyOrdinal}
abstractInst* = {tyGenericInst, tyDistinct, tyOrdinal}
skipPtrs* = {tyVar, tyPtr, tyRef, tyGenericInst}
proc skipTypes*(t: PType, kinds: TTypeKinds): PType
proc elemType*(t: PType): PType
proc containsObject*(t: PType): bool

View File

@@ -14,6 +14,7 @@ tinout.nim;7;for a 'var' type a variable needs to be passed
tinvalidnewseq.nim;10;type mismatch: got (array[0..6, string], int)
tinvwhen.nim;6;invalid indentation
titer4.nim;2;iterator within for loop context expected
tmethod.nim;2;'method' needs a parameter that has an object type
tnamspc.nim;5;undeclared identifier: 'global'
tnoop.nim;6;expression 'a()' cannot be called
tnot.nim;9;type mismatch
@@ -34,4 +35,5 @@ tstmtexp.nim;3;value returned by statement has to be discarded
ttempl2.nim;13;undeclared identifier: 'b'
ttypelessemptyset.nim;0;Error: internal error: invalid kind for last(tyEmpty)
tunderscores.nim;3;invalid token: _
twrongtupleaccess.nim;4;undeclared field: 'setBLAH'
typredef.nim;2;illegal recursion in type 'Uint8'
Can't render this file because it contains an unexpected character in line 24 and column 23.

4
tests/reject/tmethod.nim Normal file
View File

@@ -0,0 +1,4 @@
method m(i: int): int =
return 5

View File

@@ -1,3 +1,7 @@
- Tester needs to count failures
- we need a way to disable tests
High priority (version 0.9.0)
=============================