From 57e617640d6ae8f197501345f07a49a376d28a48 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 26 Apr 2019 17:33:02 +0100 Subject: [PATCH] PR c++/90243 - orphaned note in uninstantiated constexpr function gcc/cp: PR c++/90243 - orphaned note in uninstantiated constexpr function * decl.c (check_for_uninitialized_const_var): Suppress notes if no error was shown. gcc/testsuite: PR c++/90243 * g++.dg/diagnostic/pr90243.C: New test. From-SVN: r270610 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 10 +++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/diagnostic/pr90243.C | 13 +++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/diagnostic/pr90243.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ab25cb94d3d..e0a7fb9d5be 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2019-04-26 Jonathan Wakely + + PR c++/90243 - orphaned note in uninstantiated constexpr function + * decl.c (check_for_uninitialized_const_var): Suppress notes if no + error was shown. + 2019-04-26 Paolo Carlini PR c++/90173 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index ca21cbb9917..20a6e2e5b5c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5691,13 +5691,15 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p, if (!field) return true; + bool show_notes = true; + if (!constexpr_context_p) { if (CP_TYPE_CONST_P (type)) { if (complain & tf_error) - permerror (DECL_SOURCE_LOCATION (decl), - "uninitialized const %qD", decl); + show_notes = permerror (DECL_SOURCE_LOCATION (decl), + "uninitialized const %qD", decl); } else { @@ -5706,6 +5708,8 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p, error_at (DECL_SOURCE_LOCATION (decl), "uninitialized variable %qD in % " "function", decl); + else + show_notes = false; cp_function_chain->invalid_constexpr = true; } } @@ -5714,7 +5718,7 @@ check_for_uninitialized_const_var (tree decl, bool constexpr_context_p, "uninitialized variable %qD in % context", decl); - if (CLASS_TYPE_P (type) && (complain & tf_error)) + if (show_notes && CLASS_TYPE_P (type) && (complain & tf_error)) { tree defaulted_ctor; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ada8268029..9322205f0f5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-26 Jonathan Wakely + + PR c++/90243 + * g++.dg/diagnostic/pr90243.C: New test. + 2019-04-26 Paolo Carlini PR c++/90173 diff --git a/gcc/testsuite/g++.dg/diagnostic/pr90243.C b/gcc/testsuite/g++.dg/diagnostic/pr90243.C new file mode 100644 index 00000000000..3f5d915affc --- /dev/null +++ b/gcc/testsuite/g++.dg/diagnostic/pr90243.C @@ -0,0 +1,13 @@ +// { dg-do compile { target c++14 } } +struct Z { // { dg-bogus "default constructor" } + int y; // { dg-bogus "initialize" } +}; + +template +constexpr Z f(const T *data) { + Z z; + __builtin_memcpy(&z, data, sizeof(z)); + return z; +} + +constexpr Z g(const char *data) { return f(data); } -- 2.30.2