import std/macros proc getName(n: NimNode): NimNode = case n.kind of nnkPragmaExpr: n[0] else: error("unexpected node kind: " & $n.kind) macro checkSize*(size: int, typeDef: untyped): untyped = typeDef.expectKind nnkTypeDef let staticStmt = nnkStaticStmt.newTree( newCall( bindSym"assert", nnkInfix.newTree( bindSym"==", newCall( bindSym"sizeof", getName(typeDef[0]), ), size, ), ), ) result = nnkTypeDef.newTree( genSym(nskType, "_"), newEmptyNode(), nnkStmtListType.newTree( nnkTypeSection.newTree(typeDef), staticStmt, bindSym"void", ), )