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. From-SVN: r267976
This commit is contained in:
parent
647c5e3ea7
commit
2ea2a74dce
|
@ -1,3 +1,11 @@
|
|||
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.
|
||||
|
||||
2019-01-15 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
PR c++/88795
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2019-01-16 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/78244 - narrowing conversion in template not detected.
|
||||
* g++.dg/cpp0x/Wnarrowing13.C: New test.
|
||||
* g++.dg/cpp0x/Wnarrowing14.C: New test.
|
||||
|
||||
2019-01-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/51628
|
||||
|
|
|
@ -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" }
|
||||
};
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue