static Node*   inlsubst(Node *n);
 static NodeList* inlsubstlist(NodeList *ll);
 
+static void    setlno(Node*, int);
+
 // Used during inlsubst[list]
 static Node *inlfn;            // function currently being inlined
 static Node *inlretlabel;      // target of the goto substituted in place of a return
        call->nbody = body;
        call->rlist = inlretvars;
        call->type = n->type;
-       call->lineno = n->lineno;
        call->typecheck = 1;
 
+       setlno(call, n->lineno);
+
        *np = call;
 
        inlfn = saveinlfn;
 
        return m;
 }
+
+// Plaster over linenumbers
+static void
+setlnolist(NodeList *ll, int lno)
+{
+       for(;ll;ll=ll->next)
+               setlno(ll->n, lno);
+}
+
+static void
+setlno(Node *n, int lno)
+{
+       if(!n)
+               return;
+
+       // don't clobber names, unless they're freshly synthesized
+       if(n->op != ONAME || n->lineno == 0)
+               n->lineno = lno;
+       
+       setlno(n->left, lno);
+       setlno(n->right, lno);
+       setlnolist(n->list, lno);
+       setlnolist(n->rlist, lno);
+       setlnolist(n->ninit, lno);
+       setlno(n->ntest, lno);
+       setlno(n->nincr, lno);
+       setlnolist(n->nbody, lno);
+       setlnolist(n->nelse, lno);
+}