bugfix: compiler rejects methods without object parameter

This commit is contained in:
Araq 2011-01-06 09:06:43 +01:00
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 proc generateMethodDispatchers*(): PNode
# implementation # implementation
const
skipPtrs = {tyVar, tyPtr, tyRef, tyGenericInst}
proc genConv(n: PNode, d: PType, downcast: bool): PNode = proc genConv(n: PNode, d: PType, downcast: bool): PNode =
var var
dest, source: PType dest, source: PType

View file

@ -107,6 +107,7 @@ type
errArrayExpectsTwoTypeParams, errInvalidVisibilityX, errInitHereNotAllowed, errArrayExpectsTwoTypeParams, errInvalidVisibilityX, errInitHereNotAllowed,
errXCannotBeAssignedTo, errIteratorNotAllowed, errXNeedsReturnType, errXCannotBeAssignedTo, errIteratorNotAllowed, errXNeedsReturnType,
errInvalidCommandX, errXOnlyAtModuleScope, errInvalidCommandX, errXOnlyAtModuleScope,
errXNeedsParamObjectType,
errTemplateInstantiationTooNested, errInstantiationFrom, errTemplateInstantiationTooNested, errInstantiationFrom,
errInvalidIndexValueForTuple, errCommandExpectsFilename, errXExpected, errInvalidIndexValueForTuple, errCommandExpectsFilename, errXExpected,
errInvalidSectionStart, errGridTableNotImplemented, errGeneralParseError, errInvalidSectionStart, errGridTableNotImplemented, errGeneralParseError,
@ -233,6 +234,7 @@ const
"iterators can only be defined at the module\'s top level", "iterators can only be defined at the module\'s top level",
"$1 needs a return type", "invalid command: \'$1\'", "$1 needs a return type", "invalid command: \'$1\'",
"\'$1\' is only allowed at top level", "\'$1\' is only allowed at top level",
"'$1' needs a parameter that has an object type",
"template/macro instantiation too nested", "instantiation from here", "template/macro instantiation too nested", "instantiation from here",
"invalid index value for tuple subscript", "invalid index value for tuple subscript",
"command expects a filename argument", "\'$1\' expected", "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 = proc semMethod(c: PContext, n: PNode): PNode =
if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "method") if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "method")
result = semProcAux(c, n, skMethod, methodPragmas) 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 = proc semConverterDef(c: PContext, n: PNode): PNode =
if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "converter") if not isTopLevel(c): liMessage(n.info, errXOnlyAtModuleScope, "converter")

View file

@ -56,6 +56,8 @@ const
abstractVarRange* = {tyGenericInst, tyRange, tyVar, tyDistinct, tyOrdinal} abstractVarRange* = {tyGenericInst, tyRange, tyVar, tyDistinct, tyOrdinal}
abstractInst* = {tyGenericInst, tyDistinct, tyOrdinal} abstractInst* = {tyGenericInst, tyDistinct, tyOrdinal}
skipPtrs* = {tyVar, tyPtr, tyRef, tyGenericInst}
proc skipTypes*(t: PType, kinds: TTypeKinds): PType proc skipTypes*(t: PType, kinds: TTypeKinds): PType
proc elemType*(t: PType): PType proc elemType*(t: PType): PType
proc containsObject*(t: PType): bool 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) tinvalidnewseq.nim;10;type mismatch: got (array[0..6, string], int)
tinvwhen.nim;6;invalid indentation tinvwhen.nim;6;invalid indentation
titer4.nim;2;iterator within for loop context expected 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' tnamspc.nim;5;undeclared identifier: 'global'
tnoop.nim;6;expression 'a()' cannot be called tnoop.nim;6;expression 'a()' cannot be called
tnot.nim;9;type mismatch 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' ttempl2.nim;13;undeclared identifier: 'b'
ttypelessemptyset.nim;0;Error: internal error: invalid kind for last(tyEmpty) ttypelessemptyset.nim;0;Error: internal error: invalid kind for last(tyEmpty)
tunderscores.nim;3;invalid token: _ tunderscores.nim;3;invalid token: _
twrongtupleaccess.nim;4;undeclared field: 'setBLAH'
typredef.nim;2;illegal recursion in type 'Uint8' 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) High priority (version 0.9.0)
============================= =============================