Hi Jason, On 8 Jan 2025, at 22:56, Jason Merrill wrote:
> On 12/21/24 11:35 AM, Simon Martin wrote: >> When erroring out due to an incomplete type, we add a contextual note >> about the type. However, when the error is suppressed by >> -Wno-template-body, the note remains, making the compiler output >> quite >> puzzling. >> >> This patch makes sure the note is suppressed if we're processing a >> template declaration body with -Wno-template-body. >> >> Successfully tested on x86_64-pc-linux-gnu. >> >> PR c++/118163 >> >> gcc/cp/ChangeLog: >> >> * cp-tree.h (get_current_template): Declare. >> * error.cc (get_current_template): Make non static. >> * typeck2.cc (cxx_incomplete_type_inform): Suppress note when >> parsing a template declaration with -Wno-template-body. > > I think rather than adding this sort of thing in lots of places where > an error is followed by an inform, we should change error to return > bool like other diagnostic functions, and check its return value > before calling cxx_incomplete_type_inform or plain inform. This > likely involves the same number of changes, but they should be > smaller. That’d be more future-proof for sure. I can work on this change for GCC 16 if there’s consensus it’s the right thing to do. > Patrick, what do you think? > >> gcc/testsuite/ChangeLog: >> >> * g++.dg/diagnostic/incomplete-type-2.C: New test. >> * g++.dg/diagnostic/incomplete-type-2a.C: New test. >> >> --- >> gcc/cp/cp-tree.h | 1 + >> gcc/cp/error.cc | 2 +- >> gcc/cp/typeck2.cc | 6 ++++++ >> gcc/testsuite/g++.dg/diagnostic/incomplete-type-2.C | 7 +++++++ >> .../g++.dg/diagnostic/incomplete-type-2a.C | 13 >> +++++++++++++ >> 5 files changed, 28 insertions(+), 1 deletion(-) >> create mode 100644 >> gcc/testsuite/g++.dg/diagnostic/incomplete-type-2.C >> create mode 100644 >> gcc/testsuite/g++.dg/diagnostic/incomplete-type-2a.C >> >> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h >> index 6de8f64b5ee..52f954b63d9 100644 >> --- a/gcc/cp/cp-tree.h >> +++ b/gcc/cp/cp-tree.h >> @@ -7297,6 +7297,7 @@ struct decl_location_traits >> typedef hash_map<tree, location_t, decl_location_traits> >> erroneous_templates_t; >> extern GTY((cache)) erroneous_templates_t *erroneous_templates; >> +extern tree get_current_template (); >> extern bool cp_seen_error (); >> #define seen_error() cp_seen_error () >> diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc >> index 8c0644fba7e..7fd03dd6d12 100644 >> --- a/gcc/cp/error.cc >> +++ b/gcc/cp/error.cc >> @@ -197,7 +197,7 @@ class cxx_format_postprocessor : public >> format_postprocessor >> /* Return the in-scope template that's currently being parsed, or >> NULL_TREE otherwise. */ >> -static tree >> +tree >> get_current_template () >> { >> if (scope_chain && in_template_context && !current_instantiation >> ()) >> diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc >> index fce687e83b3..505c143dae7 100644 >> --- a/gcc/cp/typeck2.cc >> +++ b/gcc/cp/typeck2.cc >> @@ -273,6 +273,12 @@ cxx_incomplete_type_inform (const_tree type) >> if (!TYPE_MAIN_DECL (type)) >> return; >> + /* When processing a template declaration body, the error >> generated by the >> + caller (if any) might have been suppressed by >> -Wno-template-body. If that >> + is the case, suppress the inform as well. */ >> + if (!warn_template_body && get_current_template ()) >> + return; >> + >> location_t loc = DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)); >> tree ptype = strip_top_quals (CONST_CAST_TREE (type)); >> diff --git a/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2.C >> b/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2.C >> new file mode 100644 >> index 00000000000..e2fb20a4ae8 >> --- /dev/null >> +++ b/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2.C >> @@ -0,0 +1,7 @@ >> +// PR c++/118163 >> +// { dg-do "compile" } >> + >> +template<class T> >> +struct S { // { dg-note "until the closing brace" } >> + S s; // { dg-error "has incomplete type" } >> +}; >> diff --git a/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2a.C >> b/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2a.C >> new file mode 100644 >> index 00000000000..d13021d0b68 >> --- /dev/null >> +++ b/gcc/testsuite/g++.dg/diagnostic/incomplete-type-2a.C >> @@ -0,0 +1,13 @@ >> +// PR c++/118163 >> +// { dg-do "compile" } >> +// { dg-additional-options "-Wno-template-body" } >> + >> +template<class T> >> +struct S { // { dg-bogus "until the closing brace" } >> + S s; // { dg-bogus "has incomplete type" } >> +}; >> + >> +// Check that we don't suppress errors outside of the body. >> +struct forward_decl; // { dg-note "forward declaration" } >> +template<class T> >> +void foo (forward_decl) {} // { dg-error "has incomplete type" }