------- Comment #6 from redi at gcc dot gnu dot org  2010-06-11 12:51 -------
(In reply to comment #5)
> So is it provable that for a "T op T" to be stored in T no narrowing takes
> place?

Yes, if the values are constants.

> If the answer for T == char is no and for T == int it is yes this is rather
> fishy ;-)

That's not what I said. Look:

#include <climits>

struct A {
        char x;
};

template<char C, char D> void f() {
        A a = { C+D };
}

template<int I, int J> void g() {
        A a = { I+J };
}

int main() {
        f<1, 1>();                // OK
        g<1, 1>();                // OK

        f<CHAR_MAX, CHAR_MAX>();  // Error
}

f<1,1>() is ok, because C and D are constants. The type doesn't matter, the
result of C+D is known at compile time and fits in a char.

g<1,1>() is ok, because I and J are constants. The type doesn't matter, the
result of I+J is known at compile time and fits in a char.

f<CHAR_MAX, CHAR_MAX>() is not ok, because the result is known at compile time
and doesn't fit in a char.

See 8.5.4 [dcl.init.list]p6 in teh C++0x draft for the full rules


-- 


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

Reply via email to