https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126409

            Bug ID: 126409
           Summary: cobol vs. LoongArch: passing floating-point argument
                    is broken
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: cobol
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xry111 at gcc dot gnu.org
  Target Milestone: ---

identification division.
        program-id.  prog.
        data division.
        working-storage section.
        01 var1 float-short         .
        01 var1r float-short        .
        procedure division.
            move 1.234E30 to var1
            call     "rvar1" using by value var1 returning var1r
            display     var1r
            goback.
        end program prog.

        identification division.
        program-id. rvar1.
        data division.
        linkage section.
        01  var    float-short.
        01  varr   float-short.
        procedure division using by value var returning varr.
            move var to varr.
        end program rvar1.

outputs:

6.445972936E-44

(or some other garbage) on LoongArch.  The reason is when prog() is gimplified
it uses a vararg function_decl for rvar1, i.e. float rvar1(...), but when
rvar1() itself is gimplified it uses a different function_decl with fixed
arguments, i.e. float rvar1(float).

On LoongArch a float-point argument can be passed via FPR if it's fixed, but
not if it's varadic.  Thus the calling convention is broken here.

Reply via email to