aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-07-11 21:53:59 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-07-11 21:53:59 +0000
commit2410819b6d8cee41d044a05f0075fb338df04930 (patch)
treeadcbf8043e8e37d0c0a10e9d6dfeae133b2ae02f /gcc
parent54c61de798fe4654a15c830adc140e32b4c2da74 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/cp/decl.c3
-rw-r--r--gcc/cp/typeck2.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/Wnarrowing1.C18
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" }