[Bug c++/88829] New: Failure to deduce size of array of 2^31 chars

Casey at Carter dot net gcc-bugzilla@gcc.gnu.org
Sun Jan 13 19:48:00 GMT 2019


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

            Bug ID: 88829
           Summary: Failure to deduce size of array of 2^31 chars
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Casey at Carter dot net
  Target Milestone: ---

This sample TU:

    using size_t = decltype(sizeof(int));

    template<class T> T&& declval();

    template<class T, size_t N>
    void f(T(&&)[N]) {}

    using U = decltype(f(declval<char[(1ULL << 31)]>())); // error: size of
array is negative

fails to compile on trunk with "g++ -std=c++2a repro.cpp", diagnosing:

    <source>:8:51: error: no matching function for call to 'f(char
[2147483648])'
        8 | using U = decltype(f(declval<char[(1ULL << 31)]>())); // error:
size of array is negative
          |                                                   ^
    <source>:6:6: note: candidate: 'template<class T, long unsigned int N> void
f(T (&&)[N])'
        6 | void f(T(&&)[N]) {}
          |      ^
    <source>:6:6: note:   template argument deduction/substitution failed:
    <source>: In substitution of 'template<class T, long unsigned int N> void
f(T (&&)[N]) [with T = char; long unsigned int N = 18446744071562067968]':
    <source>:8:51:   required from here
    <source>:6:6: error: size of array is negative
    <source>:6:8: error: size of array is negative
        6 | void f(T(&&)[N]) {}
          |        ^~~~~~~~
    <source>:8:49: error: invalid initialization of reference of type 'char
(&&)[1]' from expression of type 'char [2147483648]'
        8 | using U = decltype(f(declval<char[(1ULL << 31)]>())); // error:
size of array is negative
          |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
    <source>:6:8: note: in passing argument 1 of 'void f(T (&&)[N]) [with T =
char; long unsigned int N = 18446744071562067968]'
        6 | void f(T(&&)[N]) {}
          |        ^~~~~~~~

If arrays of size >= 2^31 aren't supported - which is a perfectly legitimate
implementation limit - I expect the formation of the array type to be diagnosed
rather than the deduction to fail. Also, the "size of array is negative"
diagnostic is confusing (#87996 already makes that point).


More information about the Gcc-bugs mailing list