Hi, On 21 Dec 2024, at 17:35, 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. Ping. Thanks! Simon > > 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. > > 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" } > -- > 2.44.0