Files
Nim/tests/exception/tcpp_imported_exc.nim
metagn d991600a00 update CI to macos 13 (#24157)
Followup to #24154, packages aren't ready for macos 14 (M1/ARM CPU) yet
and it seems to be preview on azure, so upgrade to macos 13 for now.

Macos 12 gives a warning:

```
You are using macOS 12.
We (and Apple) do not provide support for this old version.
It is expected behaviour that some formulae will fail to build in this old version.
It is expected behaviour that Homebrew will be buggy and slow.
Do not create any issues about this on Homebrew's GitHub repositories.
Do not create any issues even if you think this message is unrelated.
Any opened issues will be immediately closed without response.
Do not ask for help from Homebrew or its maintainers on social media.
You may ask for help in Homebrew's discussions but are unlikely to receive a response.
Try to figure out the problem yourself and submit a fix as a pull request.
We will review it but may or may not accept it.
```

(cherry picked from commit 4a63186cda)
2025-01-14 07:30:58 +01:00

138 lines
3.0 KiB
Nim

discard """
matrix: "--mm:refc"
targets: "cpp"
output: '''
caught as std::exception
expected
finally1
finally2
finally2
2
expected
finally 1
finally 2
expected
cpp exception caught
'''
# doesn't work on macos 13 seemingly due to libc++ linking issue https://stackoverflow.com/a/77375947
disabled: osx
"""
type
std_exception* {.importcpp: "std::exception", header: "<exception>".} = object
std_runtime_error* {.importcpp: "std::runtime_error", header: "<stdexcept>".} = object
std_string* {.importcpp: "std::string", header: "<string>".} = object
proc constructStdString(s: cstring): std_string {.importcpp: "std::string(@)", constructor, header: "<string>".}
proc constructRuntimeError(s: stdstring): std_runtime_error {.importcpp: "std::runtime_error(@)", constructor.}
proc what(ex: std_runtime_error): cstring {.importcpp: "((char *)#.what())".}
proc myexception =
raise constructRuntimeError(constructStdString("cpp_exception"))
try:
myexception() # raise std::runtime_error
except std_exception:
echo "caught as std::exception"
try:
raise constructStdString("x")
except std_exception:
echo "should not happen"
except:
echo "expected"
doAssert(getCurrentException() == nil)
proc earlyReturn =
try:
try:
myexception()
finally:
echo "finally1"
except:
return
finally:
echo "finally2"
earlyReturn()
doAssert(getCurrentException() == nil)
try:
block blk1:
try:
raise newException(ValueError, "mmm")
except:
break blk1
except:
echo "should not happen"
finally:
echo "finally2"
doAssert(getCurrentException() == nil)
#--------------------------------------
# raise by pointer and also generic type
type
std_vector[T] {.importcpp"std::vector", header"<vector>".} = object
proc newVector[T](len: int): ptr std_vector[T] {.importcpp: "new std::vector<'1>(@)".}
proc deleteVector[T](v: ptr std_vector[T]) {.importcpp: "delete @; @ = NIM_NIL;".}
proc len[T](v: std_vector[T]): uint {.importcpp: "size".}
var v = newVector[int](2)
try:
try:
try:
raise v
except ptr std_vector[int] as ex:
echo len(ex[])
raise newException(ValueError, "msg5")
except:
echo "should not happen"
finally:
deleteVector(v)
except:
echo "expected"
doAssert(v == nil)
doAssert(getCurrentException() == nil)
#--------------------------------------
# mix of Nim and imported exceptions
try:
try:
try:
raise newException(KeyError, "msg1")
except KeyError:
raise newException(ValueError, "msg2")
except:
echo "should not happen"
finally:
echo "finally 1"
except:
doAssert(getCurrentExceptionMsg() == "msg2")
raise constructStdString("std::string")
finally:
echo "finally 2"
except:
echo "expected"
doAssert(getCurrentException() == nil)
try:
try:
myexception()
except std_runtime_error as ex:
echo "cpp exception caught"
raise newException(ValueError, "rewritten " & $ex.what())
except:
doAssert(getCurrentExceptionMsg() == "rewritten cpp_exception")
doAssert(getCurrentException() == nil)