mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 20:17:42 +00:00
bugfix: compiler rejects methods without object parameter
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
4
tests/reject/tmethod.nim
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
method m(i: int): int =
|
||||
return 5
|
||||
|
||||
Reference in New Issue
Block a user