http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57891

            Bug ID: 57891
           Summary: No diagnostic of narrowing conversion in non-type
                    template argument
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: imkinghan at gmail dot com

In the following C++11 program:

    template<unsigned N>
    struct A{};

    int main()
        {
        A<1-2> a;
        (void)a;
        return 0;
    }

the declaration of `a` requires a narrowing conversion to be diagnosed per 
C++11 Standard § 14.3.2/5:

>For a non-type template-parameter of integral or enumeration type, conversions 
>permitted in a converted constant expression (5.19) are applied.

and § 5.19/3:

>A converted constant expression of type T is a literal constant expression, 
>implicitly converted to type T, where the implicit conversion (if any) is 
>permitted in a literal constant expression and the implicit conversion sequence
>contains only user-defined conversions, lvalue-to-rvalue conversions (4.1), 
>integral promotions (4.5), and integral conversions (4.7) other than narrowing 
>conversions (8.5.4)

No diagnostic is forthcoming (-std-c++11;-Wall). The same narrowing conversion,
from -1 to `unsigned`, is diagnosed (with a warning) in other contexts where
the Standard prohibits the narrowing conversion, e.g.

    unsigned int ui = { -1 };

A compiler that diagnoses the narrowing conversion of a non-type template
argument (clang 3.2/3.3 makes it an error) will pinpoint a TMP bug in which
an unsigned template argument falls recursively through 0, while g++ will just
exceed `-ftemplate-depth`.

This report stems from my Stackoverflow question
http://stackoverflow.com/q/17559165/1362568

Reply via email to