https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79078

--- Comment #16 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Marek Polacek from comment #8)
> One thing we should do is to
> 
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -12643,7 +12643,7 @@ grokparms (tree parmlist, tree *parms)
>       if (deprecated_state != DEPRECATED_SUPPRESS)
>         {
>           tree deptype = type_is_deprecated (type);
> -         if (deptype)
> +         if (deptype && !TYPE_BEING_DEFINED (deptype))
>         warn_deprecated_use (deptype, NULL_TREE);
>         }
>  
> 
> i.e. don't warn if the deprecated type is being defined.

That looks sensible, but only helps for uses of the type. It doesn't help this
case where a function is deprecated (this is based on a real change I want to
make to libstdc++):


struct string
{
#if __cplusplus == 201703L
  [[deprecated("use shrink_to_fit() instead")]]
#elif __cplusplus > 201703L
private:
#endif
  void reserve()
  { }
public:

  void shrink_to_fit() { reserve(); }
};

int main()
{
  string s;
  s.shrink_to_fit();
}

When compiled as C++17 this issues a deprecated warning for the call from
shrink_to_fit(). The user of the class never calls the deprecated function
though. Calling it from another member of the class should not warn.

Marek, do you have a suggestion for how to suppress this one?

It would be very helpful to get a quick fix for this part, even if Martin's
more ambitious plan in comment 14 isn't going to be ready in the short term.

Reply via email to