diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 9c84b721ad..1a294e0793 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -1552,9 +1552,10 @@ proc track(tracked: PEffects, n: PNode) = message(tracked.config, n.info, warnPtrToCstringConv, $n[1].typ) - # Check for implicit range conversions + # Check for implicit range conversions. Compile-time constants are already + # fully known here, so only non-constant values need the downsizing warning. if n.kind == nkHiddenStdConv and (not tracked.isArrayIndexing) and - n[1].kind notin {nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit} and + getConstExpr(tracked.ownerModule, n[1], tracked.c.idgen, tracked.graph) == nil and shouldWarnRangeConversion(tracked.config, n.info, n.typ, n[1].typ): message(tracked.config, n.info, warnImplicitRangeConversion, typeToString(n[1].typ) & " -> " & typeToString(n.typ)) diff --git a/tests/range/timplicitrangedownsizing.nim b/tests/range/timplicitrangedownsizing.nim index 930d91bb11..d1409ed33e 100644 --- a/tests/range/timplicitrangedownsizing.nim +++ b/tests/range/timplicitrangedownsizing.nim @@ -75,4 +75,31 @@ wf = smallFloatRange # OK - SmallFloat range fits in WideFloatRange proc foo(x: Natural) = discard -foo(12) \ No newline at end of file +foo(12) + +block: + type + E = enum + ea, eb + + R = range[eb..eb] + I = range[0..3] + + proc accept(r: R) = discard + proc accept(i: I) = discard + + var r: R + var i: I + const enumOk = eb + const enumAlias = enumOk + const intOk = 1 + 2 + + r = eb + r = enumOk + r = enumAlias + accept(eb) + accept(enumOk) + accept(enumAlias) + + i = intOk + accept(intOk)