aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2021-01-11 11:44:36 -0500
committerMarek Polacek <polacek@redhat.com>2021-01-11 22:31:39 -0500
commit814299a9d49c25ae2e8d00ec619559b71833871a (patch)
tree0594e03748425e7d1acd2b9af0fc040ab26adb14
parent240f0a490dae0fb9ef72fa21a93e8088d17fb682 (diff)
downloadgcc-814299a9d49c25ae2e8d00ec619559b71833871a.zip
gcc-814299a9d49c25ae2e8d00ec619559b71833871a.tar.gz
gcc-814299a9d49c25ae2e8d00ec619559b71833871a.tar.bz2
c++: -Wmissing-field-initializers in unevaluated ctx [PR98620]
This PR wants us not to warn about missing field initializers when the code in question takes places in decltype and similar. Fixed thus. 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.
-rw-r--r--gcc/cp/typeck2.c2
-rw-r--r--gcc/testsuite/g++.dg/warn/Wmissing-field-initializers-2.C44
2 files changed, 46 insertions, 0 deletions
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index e50d5fe..93744fd 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 0000000..31d4d89
--- /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;
+}