bugfix: compiler rejects methods without object parameter
This commit is contained in:
parent
da325bc7a4
commit
27bc9296d1
7 changed files with 28 additions and 3 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -755,6 +755,20 @@ 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")
|
||||||
checkSonsLen(n, codePos + 1)
|
checkSonsLen(n, codePos + 1)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
4
tests/reject/tmethod.nim
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
method m(i: int): int =
|
||||||
|
return 5
|
||||||
|
|
||||||
4
todo.txt
4
todo.txt
|
|
@ -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)
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue