[llvm-bugs] [Bug 44609] New: Unused function false positive on SFINAE disabled function

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Jan 21 11:40:20 PST 2020


https://bugs.llvm.org/show_bug.cgi?id=44609

            Bug ID: 44609
           Summary: Unused function false positive on SFINAE disabled
                    function
           Product: clang
           Version: unspecified
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Frontend
          Assignee: unassignedclangbugs at nondot.org
          Reporter: rick_water at hotmail.com
                CC: llvm-bugs at lists.llvm.org, neeilans at live.com,
                    richard-llvm at metafoo.co.uk

In the code below, Clang flags a function as unused and produces a warning,
even though the function is disabled through SFINAE. It was also tested on GCC
and MSVC which don't produce any warnings, so I think this behaviour is
incorrect. I've tested it as far back as I could with compiler explorer, and it
is happening from at least version 3.3 all the way up to the latest version.

Code:
=====================
#include <cstddef>
#include <iterator>
#include <type_traits>

template <typename T, typename Tag>
class pointer_iterator
{
        public:
        using iterator_catagory = std::random_access_iterator_tag;
        using value_type = T;
        using difference_type = std::ptrdiff_t;
        using pointer = T*;
        using reference = T&;

        template <typename _ = int, typename
std::enable_if<!std::is_same<value_type, const value_type>::value, _>::type =
0>
        operator pointer_iterator<const value_type, Tag>()
        {
                return pointer_iterator<const value_type, Tag>(_value);
        }

        private:
        pointer _value = nullptr;
};

int main()
{
        pointer_iterator<const int, void> it;
}
=====================

Output:
=====================
Warning:

warning: conversion function converting 'pointer_iterator<const int, void>' to
itself will never be used
        operator pointer_iterator<const value_type, Tag>()
        ^
note: in instantiation of template class 'pointer_iterator<const int, void>'
requested here
        pointer_iterator<const int, void> it;
                                                                               
^
====================

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200121/8f0d310a/attachment.html>


More information about the llvm-bugs mailing list