This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.

### 3234. Sufficient Additional Special Math Overloads

Section: 28.7.1 [cmath.syn] Status: New Submitter: Casey Carter Opened: 2019-07-11 Last modified: 2020-04-07

Priority: 3

View other active issues in [cmath.syn].

View all other issues in [cmath.syn].

View all issues with New status.

Discussion:

The "sufficient additional overloads" wording in 28.7.1 [cmath.syn] paragraph 2 does not apply to the special math functions, since they are not "overloaded functions". The lack of "sufficient additional overloads" doesn't agree with N3060 (the final draft of ISO/IEC 29124 which standardized the mathematical special functions) [sf.cmath] paragraphs 3 and 4:

> -3- Each of the functions specified above that has one or more `double` parameters (the `double` version) shall have two additional overloads:

> 1. a version with each `double` parameter replaced with a `float` parameter (the `float` version), and

> 2. a version with each `double` parameter replaced with a `long double` parameter (the `long double` version).

> The return type of each such `float` version shall be `float`, and the return type of each such `long double` version shall be `long double`.

> -4- Moreover, each `double` version shall have sufficient additional overloads to determine which of the above three versions to actually call, by the following ordered set of rules:

> 1. First, if any argument corresponding to a `double` parameter in the `double` version has type `long double`, the `long double` version is called.

> 2. Otherwise, if any argument corresponding to a `double` parameter in the `double` version has type `double` or has an integer type, the `double` version is called.

> 3. Otherwise, the `float` version is called.

P226R1 "Mathematical Special Functions for C++17" notably states: "At the level of and following [c.math], create a new subclause with heading and initial content the same as IS 29124:2010's clause [sf.cmath], 'Additions to header `<cmath>`,' renumbering as appropriate to the new context." which suggests the change between 29124 and C++17 was an oversight and not intentional.

Notably there is implementation divergence: MSVC implements precisely the wording in C++17, whereas libstdc++ provides additional overloads as specified in 29124, so they disagree e.g. on whether `std::sph_neumann({}, {})` is well-formed.

[2020-04-07 Issue Prioritization]

Priority to 3 after reflector discussion.

Proposed resolution: