diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-07-11 21:53:59 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-07-11 21:53:59 +0000 |
commit | 2410819b6d8cee41d044a05f0075fb338df04930 (patch) | |
tree | adcbf8043e8e37d0c0a10e9d6dfeae133b2ae02f /gcc | |
parent | 54c61de798fe4654a15c830adc140e32b4c2da74 (diff) | |
download | gcc-2410819b6d8cee41d044a05f0075fb338df04930.zip gcc-2410819b6d8cee41d044a05f0075fb338df04930.tar.gz gcc-2410819b6d8cee41d044a05f0075fb338df04930.tar.bz2 |
re PR c++/53159 (Missing narrowing check)
/cp
2014-07-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53159
* call.c (build_user_type_conversion_1): Copy LOOKUP_NO_NARROWING
into convflags.
* decl.c (check_initializer): Don't call check_narrowing here,
set LOOKUP_NO_NARROWING.
* typeck2.c (digest_init_r): Likewise.
/testsuite
2014-07-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53159
* g++.dg/cpp0x/Wnarrowing1.C: New.
From-SVN: r212469
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/call.c | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 3 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/Wnarrowing1.C | 18 |
6 files changed, 36 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ef04cba..05c9615 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2014-07-11 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/53159 + * call.c (build_user_type_conversion_1): Copy LOOKUP_NO_NARROWING + into convflags. + * decl.c (check_initializer): Don't call check_narrowing here, + set LOOKUP_NO_NARROWING. + * typeck2.c (digest_init_r): Likewise. + 2014-07-10 Jason Merrill <jason@redhat.com> PR c++/61661 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e002d01..46e5186 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3586,7 +3586,8 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags, /* It's OK to bind a temporary for converting constructor arguments, but not in converting the return value of a conversion operator. */ - convflags = ((flags & LOOKUP_NO_TEMP_BIND) | LOOKUP_NO_CONVERSION); + convflags = ((flags & LOOKUP_NO_TEMP_BIND) | LOOKUP_NO_CONVERSION + | (flags & LOOKUP_NO_NARROWING)); flags &= ~LOOKUP_NO_TEMP_BIND; if (ctors) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 01d74e3..dae85c2 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5756,8 +5756,7 @@ check_initializer (tree decl, tree init, int flags, vec<tree, va_gc> **cleanups) else { init = reshape_init (type, init, tf_warning_or_error); - if (SCALAR_TYPE_P (type)) - check_narrowing (type, init); + flags |= LOOKUP_NO_NARROWING; } } else if (TREE_CODE (init) == TREE_LIST diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index f57aef1..59a4760 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1027,7 +1027,7 @@ digest_init_r (tree type, tree init, bool nested, int flags, tree *exp; if (nested) - check_narrowing (type, init); + flags |= LOOKUP_NO_NARROWING; init = convert_for_initialization (0, type, init, flags, ICR_INIT, NULL_TREE, 0, complain); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc362c3..3b676be 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-11 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/53159 + * g++.dg/cpp0x/Wnarrowing1.C: New. + 2014-07-11 Andreas Schwab <schwab@linux-m68k.org> PR preprocessor/61389 diff --git a/gcc/testsuite/g++.dg/cpp0x/Wnarrowing1.C b/gcc/testsuite/g++.dg/cpp0x/Wnarrowing1.C new file mode 100644 index 0000000..634c4c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/Wnarrowing1.C @@ -0,0 +1,18 @@ +// PR c++/53159 +// { dg-do compile { target c++11 } } +// { dg-options "-Wnarrowing -Wno-overflow" } + +struct X +{ + constexpr operator int() { return __INT_MAX__; } +}; + +int f() { return __INT_MAX__; } + +signed char a { __INT_MAX__ }; // { dg-warning "narrowing conversion" } +signed char b { f() }; // { dg-warning "narrowing conversion" } +signed char c { X{} }; // { dg-warning "narrowing conversion" } + +signed char ar[] { __INT_MAX__ }; // { dg-warning "narrowing conversion" } +signed char br[] { f() }; // { dg-warning "narrowing conversion" } +signed char cr[] { X{} }; // { dg-warning "narrowing conversion" } |