diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgstmts.nim | 6 | ||||
-rw-r--r-- | compiler/extccomp.nim | 10 | ||||
-rw-r--r-- | compiler/msgs.nim | 4 | ||||
-rw-r--r-- | compiler/pragmas.nim | 18 | ||||
-rw-r--r-- | compiler/semexprs.nim | 4 | ||||
-rw-r--r-- | compiler/semstmts.nim | 4 |
6 files changed, 36 insertions, 10 deletions
diff --git a/compiler/ccgstmts.nim b/compiler/ccgstmts.nim index 7282e6af5..123d627b5 100644 --- a/compiler/ccgstmts.nim +++ b/compiler/ccgstmts.nim @@ -973,7 +973,11 @@ proc genAsmOrEmitStmt(p: BProc, t: PNode, isAsmStmt=false): Rope = r = mangleName(p.module, sym) sym.loc.r = r # but be consequent! res.add($r) - else: internalError(t.sons[i].info, "genAsmOrEmitStmt()") + else: + var a: TLoc + initLocExpr(p, t.sons[i], a) + res.add($a.rdLoc) + #internalError(t.sons[i].info, "genAsmOrEmitStmt()") if isAsmStmt and hasGnuAsm in CC[cCompiler].props: for x in splitLines(res): diff --git a/compiler/extccomp.nim b/compiler/extccomp.nim index 1acc98836..175e8d831 100644 --- a/compiler/extccomp.nim +++ b/compiler/extccomp.nim @@ -659,8 +659,14 @@ proc compileCFile(list: TLinkedList, script: var Rope, cmds: var TStringSeq, proc getLinkCmd(projectfile, objfiles: string): string = if optGenStaticLib in gGlobalOptions: - let name = splitFile(gProjectName).name - result = CC[cCompiler].buildLib % ["libfile", (libNameTmpl() % name), + var libname: string + if options.outFile.len > 0: + libname = options.outFile.expandTilde + if not libname.isAbsolute(): + libname = getCurrentDir() / libname + else: + libname = (libNameTmpl() % splitFile(gProjectName).name) + result = CC[cCompiler].buildLib % ["libfile", libname, "objfiles", objfiles] else: var linkerExe = getConfigVar(cCompiler, ".linkerexe") diff --git a/compiler/msgs.nim b/compiler/msgs.nim index 94b0bee00..e6a2b75a6 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -48,7 +48,7 @@ type errIndexOutOfBounds, errIndexTypesDoNotMatch, errBracketsInvalidForType, errValueOutOfSetBounds, errFieldInitTwice, errFieldNotInit, errExprXCannotBeCalled, errExprHasNoType, errExprXHasNoType, - errCastNotInSafeMode, errExprCannotBeCastedToX, errCommaOrParRiExpected, + errCastNotInSafeMode, errExprCannotBeCastToX, errCommaOrParRiExpected, errCurlyLeOrParLeExpected, errSectionExpected, errRangeExpected, errMagicOnlyInSystem, errPowerOfTwoExpected, errStringMayNotBeEmpty, errCallConvExpected, errProcOnlyOneCallConv, @@ -229,7 +229,7 @@ const errExprHasNoType: "expression has no type", errExprXHasNoType: "expression \'$1\' has no type (or is ambiguous)", errCastNotInSafeMode: "\'cast\' not allowed in safe mode", - errExprCannotBeCastedToX: "expression cannot be casted to $1", + errExprCannotBeCastToX: "expression cannot be cast to $1", errCommaOrParRiExpected: "',' or ')' expected", errCurlyLeOrParLeExpected: "\'{\' or \'(\' expected", errSectionExpected: "section (\'type\', \'proc\', etc.) expected", diff --git a/compiler/pragmas.nim b/compiler/pragmas.nim index 6697abe5e..b9f00399e 100644 --- a/compiler/pragmas.nim +++ b/compiler/pragmas.nim @@ -460,8 +460,22 @@ proc semAsmOrEmit*(con: PContext, n: PNode, marker: char): PNode = result = newNode(nkAsmStmt, n.info) proc pragmaEmit(c: PContext, n: PNode) = - discard getStrLitNode(c, n) - n.sons[1] = semAsmOrEmit(c, n, '`') + if n.kind != nkExprColonExpr: + localError(n.info, errStringLiteralExpected) + else: + let n1 = n[1] + if n1.kind == nkBracket: + var b = newNodeI(nkBracket, n1.info, n1.len) + for i in 0..<n1.len: + b.sons[i] = c.semExpr(c, n1[i]) + n.sons[1] = b + else: + n.sons[1] = c.semConstExpr(c, n1) + case n.sons[1].kind + of nkStrLit, nkRStrLit, nkTripleStrLit: + n.sons[1] = semAsmOrEmit(c, n, '`') + else: + localError(n.info, errStringLiteralExpected) proc noVal(n: PNode) = if n.kind == nkExprColonExpr: invalidPragma(n) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 5e6611064..9076ce99b 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -127,7 +127,7 @@ proc checkConvertible(c: PContext, castDest, src: PType): TConvStatus = discard proc isCastable(dst, src: PType): bool = - ## Checks whether the source type can be casted to the destination type. + ## Checks whether the source type can be cast to the destination type. ## Casting is very unrestrictive; casts are allowed as long as ## castDest.size >= src.size, and typeAllowed(dst, skParam) #const @@ -223,7 +223,7 @@ proc semCast(c: PContext, n: PNode): PNode = addSon(result, copyTree(n.sons[0])) addSon(result, semExprWithType(c, n.sons[1])) if not isCastable(result.typ, result.sons[1].typ): - localError(result.info, errExprCannotBeCastedToX, + localError(result.info, errExprCannotBeCastToX, typeToString(result.typ)) proc semLowHigh(c: PContext, n: PNode, m: TMagic): PNode = diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index fb57f6500..ec4279e60 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -760,8 +760,10 @@ proc typeSectionRightSidePass(c: PContext, n: PNode) = internalAssert st.kind in {tyPtr, tyRef} internalAssert st.lastSon.sym == nil incl st.flags, tfRefsAnonObj - st.lastSon.sym = newSym(skType, getIdent(s.name.s & ":ObjectType"), + let obj = newSym(skType, getIdent(s.name.s & ":ObjectType"), getCurrOwner(), s.info) + obj.typ = st.lastSon + st.lastSon.sym = obj proc checkForMetaFields(n: PNode) = |