* C++ PATCH for c++/78244 - narrowing conversion in template not detected
@ 2019-01-16 12:32 Marek Polacek
2019-01-16 15:51 ` Jason Merrill
0 siblings, 1 reply; 2+ messages in thread
From: Marek Polacek @ 2019-01-16 12:32 UTC (permalink / raw)
To: Jason Merrill, GCC Patches
While looking into 88815, a 9 regression, I realized we'll have to fix 78244
first. This patch fixes one half of 78244. The problem was that we never
detected narrowing conversion in a template, because the IMPLICIT_CONV_EXPR
template code doesn't have the information whether it was initialized by a
braced-init-list. This patch adds such a bit, which works much like
IMPLICIT_CONV_EXPR_DIRECT_INIT.
Bootstrapped/regtested on x86_64-linux, ok for trunk?
2019-01-16 Marek Polacek <polacek@redhat.com>
PR c++/78244 - narrowing conversion in template not detected.
* call.c (perform_implicit_conversion_flags): Set
IMPLICIT_CONV_EXPR_BRACED_INIT.
* cp-tree.h (IMPLICIT_CONV_EXPR_BRACED_INIT): New.
* pt.c (tsubst_copy_and_build): Use it.
* g++.dg/cpp0x/Wnarrowing13.C: New test.
* g++.dg/cpp0x/Wnarrowing14.C: New test.
diff --git gcc/cp/call.c gcc/cp/call.c
index 8bc8566e8d6..4f04b610004 100644
--- gcc/cp/call.c
+++ gcc/cp/call.c
@@ -11018,6 +11018,8 @@ perform_implicit_conversion_flags (tree type, tree expr,
expr = build1 (IMPLICIT_CONV_EXPR, type, expr);
if (!(flags & LOOKUP_ONLYCONVERTING))
IMPLICIT_CONV_EXPR_DIRECT_INIT (expr) = true;
+ if (flags & LOOKUP_NO_NARROWING)
+ IMPLICIT_CONV_EXPR_BRACED_INIT (expr) = true;
}
else
expr = convert_like (conv, expr, complain);
diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h
index 6a2004330d2..1c85b37ba7f 100644
--- gcc/cp/cp-tree.h
+++ gcc/cp/cp-tree.h
@@ -442,6 +442,7 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
OVL_HIDDEN_P (in OVERLOAD)
SWITCH_STMT_NO_BREAK_P (in SWITCH_STMT)
LAMBDA_EXPR_CAPTURE_OPTIMIZED (in LAMBDA_EXPR)
+ IMPLICIT_CONV_EXPR_BRACED_INIT (in IMPLICIT_CONV_EXPR)
3: (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
ICS_BAD_FLAG (in _CONV)
FN_TRY_BLOCK_P (in TRY_BLOCK)
@@ -4229,6 +4230,11 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
#define IMPLICIT_CONV_EXPR_NONTYPE_ARG(NODE) \
(TREE_LANG_FLAG_1 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
+/* True if NODE represents a conversion for braced-init-list in a
+ template. Set by perform_implicit_conversion_flags. */
+#define IMPLICIT_CONV_EXPR_BRACED_INIT(NODE) \
+ (TREE_LANG_FLAG_2 (IMPLICIT_CONV_EXPR_CHECK (NODE)))
+
/* Nonzero means that an object of this type cannot be initialized using
an initializer list. */
#define CLASSTYPE_NON_AGGREGATE(NODE) \
diff --git gcc/cp/pt.c gcc/cp/pt.c
index c6fc1cfeffb..83bceb26474 100644
--- gcc/cp/pt.c
+++ gcc/cp/pt.c
@@ -18210,6 +18210,8 @@ tsubst_copy_and_build (tree t,
int flags = LOOKUP_IMPLICIT;
if (IMPLICIT_CONV_EXPR_DIRECT_INIT (t))
flags = LOOKUP_NORMAL;
+ if (IMPLICIT_CONV_EXPR_BRACED_INIT (t))
+ flags |= LOOKUP_NO_NARROWING;
RETURN (perform_implicit_conversion_flags (type, expr, complain,
flags));
}
diff --git gcc/testsuite/g++.dg/cpp0x/Wnarrowing13.C gcc/testsuite/g++.dg/cpp0x/Wnarrowing13.C
new file mode 100644
index 00000000000..3750f293df3
--- /dev/null
+++ gcc/testsuite/g++.dg/cpp0x/Wnarrowing13.C
@@ -0,0 +1,8 @@
+// PR c++/78244
+// { dg-do compile { target c++11 } }
+
+template<typename>
+struct S {
+ static const int i{1.1}; // { dg-error "narrowing conversion" }
+ static const int i2 = {1.1}; // { dg-error "narrowing conversion" }
+};
diff --git gcc/testsuite/g++.dg/cpp0x/Wnarrowing14.C gcc/testsuite/g++.dg/cpp0x/Wnarrowing14.C
new file mode 100644
index 00000000000..1aa22196f33
--- /dev/null
+++ gcc/testsuite/g++.dg/cpp0x/Wnarrowing14.C
@@ -0,0 +1,17 @@
+// PR c++/78244
+// { dg-do compile { target c++11 } }
+
+using Number = unsigned int;
+
+template <int>
+struct S {
+ S() {
+ const Number x = {-1}; // { dg-error "narrowing conversion" }
+ (void)x;
+ }
+};
+
+int main()
+{
+ S<1> s;
+}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: C++ PATCH for c++/78244 - narrowing conversion in template not detected
2019-01-16 12:32 C++ PATCH for c++/78244 - narrowing conversion in template not detected Marek Polacek
@ 2019-01-16 15:51 ` Jason Merrill
0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2019-01-16 15:51 UTC (permalink / raw)
To: Marek Polacek, GCC Patches
On 1/16/19 7:32 AM, Marek Polacek wrote:
> While looking into 88815, a 9 regression, I realized we'll have to fix 78244
> first. This patch fixes one half of 78244. The problem was that we never
> detected narrowing conversion in a template, because the IMPLICIT_CONV_EXPR
> template code doesn't have the information whether it was initialized by a
> braced-init-list. This patch adds such a bit, which works much like
> IMPLICIT_CONV_EXPR_DIRECT_INIT.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
OK.
Jason
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-01-16 15:51 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-16 12:32 C++ PATCH for c++/78244 - narrowing conversion in template not detected Marek Polacek
2019-01-16 15:51 ` Jason Merrill
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).