trigger range check with new type inference on nkIntLit [backport:1.6] (#23179)

fixes #23177

`changeType` doesn't perform range checks to see if the expression fits
the new type [if the old type is the same as the new
type](62d8ca4306/compiler/semexprs.nim (L633)).
For `nkIntLit`, we previously set the type to the concrete base of the
expected type first, then call `changeType`, which works for things like
range types but not bare types of smaller bit size like `int8`. Now we
don't set the type (so the type is nil), and `changeType` performs the
range check when the type is unset (nil).
This commit is contained in:
metagn
2024-01-08 05:44:04 +03:00
committed by GitHub
parent 62d8ca4306
commit 00be8f287a
2 changed files with 11 additions and 2 deletions

View File

@@ -630,7 +630,7 @@ proc changeType(c: PContext; n: PNode, newType: PType, check: bool) =
a.add m
changeType(m, tup[i], check)
of nkCharLit..nkUInt64Lit:
if check and n.kind != nkUInt64Lit and not sameType(n.typ, newType):
if check and n.kind != nkUInt64Lit and not sameTypeOrNil(n.typ, newType):
let value = n.intVal
if value < firstOrd(c.config, newType) or value > lastOrd(c.config, newType):
localError(c.config, n.info, "cannot convert " & $value &
@@ -3152,7 +3152,6 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType
expected.kind in {tyInt..tyInt64,
tyUInt..tyUInt64,
tyFloat..tyFloat128}):
result.typ = expected
if expected.kind in {tyFloat..tyFloat128}:
n.transitionIntToFloatKind(nkFloatLit)
changeType(c, result, expectedType, check=true)

View File

@@ -0,0 +1,10 @@
discard """
errormsg: "cannot convert 256 to int8"
line: 9
"""
# issue #23177
var x: int8
x = 256
echo x # 0