This PR wants us not to warn about missing field initializers when the code in question takes places in decltype and similar. Fixed thus.
Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? gcc/cp/ChangeLog: PR c++/98620 * typeck2.c (process_init_constructor_record): Don't emit -Wmissing-field-initializers warnings in unevaluated contexts. gcc/testsuite/ChangeLog: PR c++/98620 * g++.dg/warn/Wmissing-field-initializers-2.C: New test. --- gcc/cp/typeck2.c | 2 + .../warn/Wmissing-field-initializers-2.C | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-2.C diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index e50d5fe94cd..93744fdafde 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1563,6 +1563,7 @@ process_init_constructor_record (tree type, tree init, int nested, int flags, /* Warn when some struct elements are implicitly initialized. */ if ((complain & tf_warning) + && !cp_unevaluated_operand && !EMPTY_CONSTRUCTOR_P (init)) warning (OPT_Wmissing_field_initializers, "missing initializer for member %qD", field); @@ -1593,6 +1594,7 @@ process_init_constructor_record (tree type, tree init, int nested, int flags, /* Warn when some struct elements are implicitly initialized to zero. */ if ((complain & tf_warning) + && !cp_unevaluated_operand && !EMPTY_CONSTRUCTOR_P (init)) warning (OPT_Wmissing_field_initializers, "missing initializer for member %qD", field); diff --git a/gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-2.C b/gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-2.C new file mode 100644 index 00000000000..31d4d897984 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-2.C @@ -0,0 +1,44 @@ +// PR c++/98620 +// { dg-do compile { target c++11 } } + +namespace std { + template<typename T> + T&& declval() noexcept; + + template<bool B> + struct bool_constant { + static constexpr bool value = B; + using type = bool_constant; + }; + using true_type = bool_constant<true>; + using false_type = bool_constant<false>; +}; + +template <typename T> +struct TmpArray +{ + T arr[1]; +}; + +template <typename Src, typename Dst, typename = void> +struct is_non_narrowing_conversion : std::false_type +{}; + +template <typename Src, typename Dst> +struct is_non_narrowing_conversion< + Src, Dst, + decltype(void(TmpArray<Dst>{{ std::declval<Src>() }})) // { dg-bogus "missing initializer" } +> : std::true_type +{}; + +struct mystruct +{ + int a; + void * b; +}; + +void test_nok() +{ + is_non_narrowing_conversion<int&, mystruct>::type v; + (void) v; +} base-commit: a958b2fc6dab3d8b01b6ee32178e2fccd97f77f8 -- 2.29.2