Skip to content

Commit

Permalink
allow non-pragma special words as user pragmas (#22526)
Browse files Browse the repository at this point in the history
allow non-pragma special words as macro pragmas

fixes #22525
  • Loading branch information
metagn committed Aug 21, 2023
1 parent 942f846 commit 602f537
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
8 changes: 5 additions & 3 deletions compiler/trees.nim
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,12 @@ proc whichPragma*(n: PNode): TSpecialWord =
case key.kind
of nkIdent: result = whichKeyword(key.ident)
of nkSym: result = whichKeyword(key.sym.name)
of nkCast: result = wCast
of nkCast: return wCast
of nkClosedSymChoice, nkOpenSymChoice:
result = whichPragma(key[0])
else: result = wInvalid
return whichPragma(key[0])
else: return wInvalid
if result in nonPragmaWordsLow..nonPragmaWordsHigh:
result = wInvalid

proc isNoSideEffectPragma*(n: PNode): bool =
var k = whichPragma(n)
Expand Down
27 changes: 19 additions & 8 deletions compiler/wordrecg.nim
Original file line number Diff line number Diff line change
Expand Up @@ -91,28 +91,36 @@ type
wRedefine = "redefine", wCallsite = "callsite",
wQuirky = "quirky",

# codegen keywords, but first the ones that are also pragmas:
wExtern = "extern", wGoto = "goto", wRegister = "register",
wUnion = "union", wPacked = "packed", wVirtual = "virtual",
wVolatile = "volatile", wMember = "member",
wByCopy = "bycopy", wByRef = "byref",

# codegen keywords but not pragmas:
wAuto = "auto", wBool = "bool", wCatch = "catch", wChar = "char",
wClass = "class", wCompl = "compl", wConstCast = "const_cast", wDefault = "default",
wDelete = "delete", wDouble = "double", wDynamicCast = "dynamic_cast",
wExplicit = "explicit", wExtern = "extern", wFalse = "false", wFloat = "float",
wFriend = "friend", wGoto = "goto", wInt = "int", wLong = "long", wMutable = "mutable",
wExplicit = "explicit", wFalse = "false", wFloat = "float",
wFriend = "friend", wInt = "int", wLong = "long", wMutable = "mutable",
wNamespace = "namespace", wNew = "new", wOperator = "operator", wPrivate = "private",
wProtected = "protected", wPublic = "public", wRegister = "register",
wProtected = "protected", wPublic = "public",
wReinterpretCast = "reinterpret_cast", wRestrict = "restrict", wShort = "short",
wSigned = "signed", wSizeof = "sizeof", wStaticCast = "static_cast", wStruct = "struct",
wSwitch = "switch", wThis = "this", wThrow = "throw", wTrue = "true", wTypedef = "typedef",
wTypeid = "typeid", wTypeof = "typeof", wTypename = "typename",
wUnion = "union", wPacked = "packed", wUnsigned = "unsigned", wVirtual = "virtual",
wVoid = "void", wVolatile = "volatile", wWchar = "wchar_t", wMember = "member",
wUnsigned = "unsigned", wVoid = "void",

wAlignas = "alignas", wAlignof = "alignof", wConstexpr = "constexpr", wDecltype = "decltype",
wNullptr = "nullptr", wNoexcept = "noexcept",
wThreadLocal = "thread_local", wStaticAssert = "static_assert",
wChar16 = "char16_t", wChar32 = "char32_t",
wChar16 = "char16_t", wChar32 = "char32_t", wWchar = "wchar_t",

wStdIn = "stdin", wStdOut = "stdout", wStdErr = "stderr",

wInOut = "inout", wByCopy = "bycopy", wByRef = "byref", wOneWay = "oneway",
wInOut = "inout", wOneWay = "oneway",
# end of codegen keywords

wBitsize = "bitsize", wImportHidden = "all",
wSendable = "sendable"

Expand All @@ -125,12 +133,15 @@ const
nimKeywordsLow* = ord(wAsm)
nimKeywordsHigh* = ord(wYield)

ccgKeywordsLow* = ord(wAuto)
ccgKeywordsLow* = ord(wExtern)
ccgKeywordsHigh* = ord(wOneWay)

cppNimSharedKeywords* = {
wAsm, wBreak, wCase, wConst, wContinue, wDo, wElse, wEnum, wExport,
wFor, wIf, wReturn, wStatic, wTemplate, wTry, wWhile, wUsing}

nonPragmaWordsLow* = wAuto
nonPragmaWordsHigh* = wOneWay


from std/enumutils import genEnumCaseStmt
Expand Down
5 changes: 5 additions & 0 deletions tests/pragmas/tpragmas_misc.nim
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,8 @@ block: # issue #10994

proc a {.bar.} = discard # works
proc b {.bar, foo.} = discard # doesn't

block: # issue #22525
macro catch(x: typed) = x
proc thing {.catch.} = discard
thing()

0 comments on commit 602f537

Please sign in to comment.