+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
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);
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)
#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) \
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));
}
+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
--- /dev/null
+// 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" }
+};
--- /dev/null
+// 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;
+}