From ac3e7edfe43a6353da286fa9606319efaf8d60d3 Mon Sep 17 00:00:00 2001 From: Araq Date: Tue, 16 May 2017 22:07:44 +0200 Subject: weaken the rules for proc definition pragmas that have been forwarded --- compiler/semstmts.nim | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'compiler') diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index c7f27f0a2..3d70e7295 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -1325,8 +1325,16 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind, implicitPragmas(c, s, n, validPragmas) else: if n.sons[pragmasPos].kind != nkEmpty: - localError(n.sons[pragmasPos].info, errPragmaOnlyInHeaderOfProcX, - "'" & proto.name.s & "' from " & $proto.info) + pragma(c, s, n.sons[pragmasPos], validPragmas) + # To ease macro generation that produce forwarded .async procs we now + # allow a bit redudancy in the pragma declarations. The rule is + # a prototype's pragma list must be a superset of the current pragma + # list. + # XXX This needs more checks eventually, for example that external + # linking names do agree: + if proto.typ.callConv != s.typ.callConv or proto.typ.flags < s.typ.flags: + localError(n.sons[pragmasPos].info, errPragmaOnlyInHeaderOfProcX, + "'" & proto.name.s & "' from " & $proto.info) if sfForward notin proto.flags: wrongRedefinition(n.info, proto.name.s) excl(proto.flags, sfForward) -- cgit 1.4.1-2-gfad0