Curiouser and curiouser. 

With no init.el or early-init.el:

   emacs --eval "(let ((default-frame-alist '((left . 1000)))) (make-frame-command))"

works (it creates an additional frame, displaced to the right).

   emacs --eval "(let ((default-frame-alist '((left . (- 0))))) (make-frame-command))"
 
lisp.h:1231: Emacs fatal error: assertion failed: FIXNUMP (a)

Or, equivalently,

  emacs -Q --no-site-file

  M-: (let ((default-frame-alist '((left . (- 0))))) (make-frame-command)) <RET>

so the bit about early-init.el seems like a red herring.



On Sat, Sep 21, 2019 at 2:27 PM Eli Zaretskii <eliz@gnu.org> wrote:
> From: Juanma Barranquero <lekktu@gmail.com>
> Date: Sat, 21 Sep 2019 12:02:51 +0200
> Cc: martin rudalics <rudalics@gmx.at>, 37415@debbugs.gnu.org
>
> Before 572fe798cd0a00ad4a9050a7962cf8e8fbcc209b (from 2014-09-30), the computation of left and top
> was done in w32_createwindow:
>
>       /* When called with RES_TYPE_NUMBER, w32_get_arg will return zero
>         for anything that is not a number and is not Qunbound.  */
>       left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
>       top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
>
> and anything not a number was turned to 0.
>
> In that commit you moved the code to my_create_window and used XINT:
>
>  +  /* When called with RES_TYPE_NUMBER, x_get_arg will return zero for
>  +     anything that is not a number and is not Qunbound.  */
>  +  left = x_get_arg (dpyinfo, Qnil, Qleft, "left", "Left", RES_TYPE_NUMBER);
>  +  top = x_get_arg (dpyinfo, Qnil, Qtop, "top", "Top", RES_TYPE_NUMBER);
>  +  if (EQ (left, Qunbound))
>  +    coords[0] = CW_USEDEFAULT;
>  +  else
>  +    coords[0] = XINT (left);
>  +  if (EQ (top, Qunbound))
>  +    coords[1] = CW_USEDEFAULT;
>  +  else
>  +    coords[1] = XINT (top);
>  +

Yes, but contrary to the comment, in the case in point we don't get
zero from x_get_arg.  Which is why I asked all those questions.