Skip to content

Commit

Permalink
Make error message for empty new-styled concept more descriptive (nim…
Browse files Browse the repository at this point in the history
…-lang#18506)

* Allow empty new-styled concept

Slightly improve error messages

* Make empty new-styled concepts an error
  • Loading branch information
konsumlamm authored and PMunch committed Mar 28, 2022
1 parent 2016afa commit a218bf1
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 11 deletions.
15 changes: 7 additions & 8 deletions compiler/concepts.nim
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@
## for details. Note this is a first implementation and only the "Concept matching"
## section has been implemented.

import ast, astalgo, semdata, lookups, lineinfos, idents, msgs, renderer,
types, intsets
import ast, astalgo, semdata, lookups, lineinfos, idents, msgs, renderer, types, intsets

from magicsys import addSonSkipIntLit

Expand All @@ -23,7 +22,7 @@ const
## --------------------------------------

proc declareSelf(c: PContext; info: TLineInfo) =
## adds the magical 'Self' symbols to the current scope.
## Adds the magical 'Self' symbols to the current scope.
let ow = getCurrOwner(c)
let s = newSym(skType, getIdent(c.cache, "Self"), nextSymId(c.idgen), ow, info)
s.typ = newType(tyTypeDesc, nextTypeId(c.idgen), ow)
Expand All @@ -32,7 +31,7 @@ proc declareSelf(c: PContext; info: TLineInfo) =
addDecl(c, s, info)

proc isSelf*(t: PType): bool {.inline.} =
## is this the magical 'Self' type?
## Is this the magical 'Self' type?
t.kind == tyTypeDesc and tfPacked in t.flags

proc makeTypeDesc*(c: PContext, typ: PType): PType =
Expand All @@ -45,8 +44,8 @@ proc makeTypeDesc*(c: PContext, typ: PType): PType =

proc semConceptDecl(c: PContext; n: PNode): PNode =
## Recursive helper for semantic checking for the concept declaration.
## Currently we only support lists of statements containing 'proc'
## declarations and the like.
## Currently we only support (possibly empty) lists of statements
## containing 'proc' declarations and the like.
case n.kind
of nkStmtList, nkStmtListExpr:
result = shallowCopy(n)
Expand All @@ -60,7 +59,7 @@ proc semConceptDecl(c: PContext; n: PNode): PNode =
result[i] = n[i]
result[^1] = semConceptDecl(c, n[^1])
else:
localError(c.config, n.info, "unexpected construct in the new-styled concept " & renderTree(n))
localError(c.config, n.info, "unexpected construct in the new-styled concept: " & renderTree(n))
result = n

proc semConceptDeclaration*(c: PContext; n: PNode): PNode =
Expand Down Expand Up @@ -97,7 +96,7 @@ proc existingBinding(m: MatchCon; key: PType): PType =
proc conceptMatchNode(c: PContext; n: PNode; m: var MatchCon): bool

proc matchType(c: PContext; f, a: PType; m: var MatchCon): bool =
## the heart of the concept matching process. 'f' is the formal parameter of some
## The heart of the concept matching process. 'f' is the formal parameter of some
## routine inside the concept that we're looking for. 'a' is the formal parameter
## of a routine that might match.
const
Expand Down
2 changes: 2 additions & 0 deletions compiler/parser.nim
Original file line number Diff line number Diff line change
Expand Up @@ -2058,6 +2058,8 @@ proc parseTypeClass(p: var Parser): PNode =
skipComment(p, result)
# an initial IND{>} HAS to follow:
if not realInd(p):
if result.isNewStyleConcept:
parMessage(p, "routine expected, but found '$1' (empty new-styled concepts are not allowed)", p.tok)
result.add(p.emptyNode)
else:
result.add(parseStmt(p))
Expand Down
5 changes: 2 additions & 3 deletions tests/concepts/tspec.nim
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ discard """
2
3
yes int
string int
true'''
string int'''
joinable: false
"""

Expand Down Expand Up @@ -102,5 +101,5 @@ type Monoid = concept

proc z(x: typedesc[int]): int = 0

echo(int is Monoid)
doAssert int is Monoid

0 comments on commit a218bf1

Please sign in to comment.