summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorringabout <43030857+ringabout@users.noreply.github.com>2023-12-06 04:04:41 +0800
committerGitHub <noreply@github.com>2023-12-05 21:04:41 +0100
commitd20b4d5168780b9c6a3bd2fde28b171cb7414c98 (patch)
tree10c1f7802870f27026a78729473439218c67f1f6
parent202e21daba1424762cf330effb52220c6f1d5772 (diff)
downloadNim-d20b4d5168780b9c6a3bd2fde28b171cb7414c98.tar.gz
fixes #23019; Regression from 2.0 to devel with raise an unlisted exc… (#23034)
…eption: Exception

fixes #23019

I suppose `implicitPragmas` is called somewhere which converts
`otherPragmas`.
-rw-r--r--compiler/pragmas.nim2
-rw-r--r--tests/pragmas/tpush.nim22
2 files changed, 23 insertions, 1 deletions
diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim
index d4817ce7a..a800edaf8 100644
--- a/compiler/pragmas.nim
+++ b/compiler/pragmas.nim
@@ -1313,7 +1313,7 @@ proc implicitPragmas*(c: PContext, sym: PSym, info: TLineInfo,
   if sym != nil and sym.kind != skModule:
     for it in c.optionStack:
       let o = it.otherPragmas
-      if not o.isNil:
+      if not o.isNil and sfFromGeneric notin sym.flags: # bug #23019
         pushInfoContext(c.config, info)
         var i = 0
         while i < o.len:
diff --git a/tests/pragmas/tpush.nim b/tests/pragmas/tpush.nim
index 6a95f1ca0..8ebbfe3d3 100644
--- a/tests/pragmas/tpush.nim
+++ b/tests/pragmas/tpush.nim
@@ -77,3 +77,25 @@ block: # bug #22913
     {.pop.}
 
     discard foo2()
+
+block: # bug #23019
+  proc f(x: bool)
+
+  proc a(x: int) =
+    if false: f(true)
+
+  proc f(x: bool) =
+    if false: a(0)
+
+  proc k(r: int|int) {.inline.} =  # seems to require being generic and inline
+    if false: a(0)
+
+
+  # {.push tags: [].}
+  {.push raises: [].}
+
+  {.push warning[ObservableStores]:off.}  # can be any warning, off or on
+  let w = 0
+  k(w)
+  {.pop.}
+  {.pop.}