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

Elias Pipping <pipping at exherbo dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pipping at exherbo dot org

--- Comment #18 from Elias Pipping <pipping at exherbo dot org> ---
The current status (with gcc 5.3) of these deprecation warnings is quite
surprising: from my point of view there are both false negatives and false
positives. Since clang's behaviour, additionally, differs considerably from
gcc's, it's currently almost impossible to deprecate something in a portable
fashion.

Here's an example. Let's assume I've reimplemented enable_if and want to
deprecated it.

namespace Dune {
  template<bool B, class T = void>
  struct [[deprecated]] enable_if
  {};

  template<class T>
  struct enable_if<true,T>
  {
    typedef T type;
  };
}

This generates a warning even if enable_if is never used anywhere, simply
through the template specialisation (if I were to remove the specialisation,
the warning would go away):

% g++ -c -std=c++14 test.cc -Wall -Wextra
test.cc:7:10: warning: ‘template<bool B, class T> struct Dune::enable_if’ is
deprecated [-Wdeprecated-declarations]
   struct enable_if<true,T>
          ^
test.cc:3:25: note: declared here
   struct [[deprecated]] enable_if
                         ^
%

Clang does not emit a warning here.

Fair enough, maybe I should deprecate specialisations rather than the template.
But this does not work as expected, either. The following code surprisingly
does not emit a single warning:

#include <type_traits>

namespace Dune {
  template<bool B, class T = void>
  struct enable_if
  {};

  template<class T>
  struct [[deprecated]] enable_if<false,T>
  {};

  template<class T>
  struct [[deprecated]] enable_if<true,T>
  {
    typedef T type;
  };
}

int
main()
{
  using newint = Dune::enable_if<std::is_integral<int>::value,int>::type;
  newint i = 2;
  ++i;
}

Reply via email to