diff options
-rw-r--r-- | compiler/commands.nim | 2 | ||||
-rw-r--r-- | compiler/options.nim | 2 | ||||
-rw-r--r-- | compiler/semexprs.nim | 8 | ||||
-rw-r--r-- | web/news.txt | 3 |
4 files changed, 11 insertions, 4 deletions
diff --git a/compiler/commands.nim b/compiler/commands.nim index 6b2f074e8..2ed3f92a9 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 98224a11d..6dd917ad4 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 664102b75..f1016595a 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 d1a730ea5..f0485f75b 100644 --- a/web/news.txt +++ b/web/news.txt @@ -151,6 +151,9 @@ can be found `here <https://nimworkshop.splashthat.com/>`_. (issue `#2599 <https://github.com/nim-lang/Nim/issues/2599>`_). - The compiler now supports a `bitsize pragma <docs/manual.html#pragmas-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 |