diff --git a/compiler/commands.nim b/compiler/commands.nim
index 6b2f074e86..2ed3f92a9c 100644
--- a/compiler/commands.nim
+++ b/compiler/commands.nim
@@ -434,6 +434,8 @@ proc processSwitch(switch, arg: string, pass: TCmdLinePass, info: TLineInfo) =
of "linedir": processOnOffSwitch({optLineDir}, arg, pass, info)
of "assertions", "a": processOnOffSwitch({optAssert}, arg, pass, info)
of "deadcodeelim": processOnOffSwitchG({optDeadCodeElim}, arg, pass, info)
+ of "reportconceptfailures":
+ processOnOffSwitchG({optReportConceptFailures}, arg, pass, info)
of "threads":
processOnOffSwitchG({optThreads}, arg, pass, info)
#if optThreads in gGlobalOptions: incl(gNotes, warnGcUnsafe)
diff --git a/compiler/options.nim b/compiler/options.nim
index 98224a11df..6dd917ad49 100644
--- a/compiler/options.nim
+++ b/compiler/options.nim
@@ -40,7 +40,7 @@ type # please make sure we have under 32 options
TGlobalOption* = enum # **keep binary compatible**
gloptNone, optForceFullMake, optDeadCodeElim,
optListCmd, optCompileOnly, optNoLinking,
- optSafeCode, # only allow safe code
+ optReportConceptFailures, # report 'compiles' or 'concept' matching failures
optCDebug, # turn on debugging information
optGenDynLib, # generate a dynamic library
optGenStaticLib, # generate a static library
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 664102b751..f1016595a0 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -292,8 +292,6 @@ proc semConv(c: PContext, n: PNode): PNode =
proc semCast(c: PContext, n: PNode): PNode =
## Semantically analyze a casting ("cast[type](param)")
- if optSafeCode in gGlobalOptions: localError(n.info, errCastNotInSafeMode)
- #incl(c.p.owner.flags, sfSideEffect)
checkSonsLen(n, 2)
result = newNodeI(nkCast, n.info)
result.typ = semTypeNode(c, n.sons[0], nil)
@@ -1659,11 +1657,13 @@ proc tryExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
let oldInGenericInst = c.inGenericInst
let oldProcCon = c.p
c.generics = @[]
+ var err: string
try:
result = semExpr(c, n, flags)
if msgs.gErrorCounter != oldErrorCount: result = nil
except ERecoverableError:
- discard
+ if optReportConceptFailures in gGlobalOptions:
+ err = getCurrentExceptionMsg()
# undo symbol table changes (as far as it's possible):
c.compilesContextId = oldCompilesId
c.generics = oldGenerics
@@ -1677,6 +1677,8 @@ proc tryExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
errorOutputs = oldErrorOutputs
msgs.gErrorCounter = oldErrorCount
msgs.gErrorMax = oldErrorMax
+ if optReportConceptFailures in gGlobalOptions and not err.isNil:
+ localError(n.info, err)
proc semCompiles(c: PContext, n: PNode, flags: TExprFlags): PNode =
# we replace this node by a 'true' or 'false' node:
diff --git a/web/news.txt b/web/news.txt
index d1a730ea55..f0485f75bf 100644
--- a/web/news.txt
+++ b/web/news.txt
@@ -151,6 +151,9 @@ can be found `here `_.
(issue `#2599 `_).
- The compiler now supports a `bitsize pragma `_
for constructing bitfields.
+ - Added a new ``--reportConceptFailures`` switch for better debugging of
+ concept related type mismatches. This can also be used to debug
+ ``system.compiles`` failures.
Language Additions