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

            Bug ID: 104824
           Summary: std::comp_ellint1 handles domain error incorrectly
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

The standard defines std::comp_ellint1 for |k| <= 1, but we do:

      else if (std::abs(__k) >= _Tp(1))
        return std::numeric_limits<_Tp>::quiet_NaN();

This is the wrong condition, and is not the correct way to report the error.

Reporting a domain error should be done as specified by C:

"On a domain error, the function returns an implementation-defined value; if
the integer expression math_errhandling & MATH_ERRNO is nonzero, the integer
expression errno acquires the value EDOM; if the integer expression
math_errhandling & MATH_ERREXCEPT is nonzero, the “invalid” floating-point
exception is raised."

Other special functions throw std::domain_error, which isn't right either.

We should check all the domains, and fix the method of error reporting.

Reply via email to