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

            Bug ID: 97661
           Summary: Bogus error message about initializing a using
                    declaration
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: markus.boeck02 at gmail dot com
  Target Milestone: ---

Following code produces an error message I can't quite decipher. The code to my
knowledge is also correct and compiles with clang and MSVC:

template <class...Args>
class Base
{

};

class Derived : public Base<int,double,float>
{

};

template <class...Args>
struct DeduceArgs
{
    Base<Args...>* p;

    using type = Base<Args...>;
};

template <class ...Args>
DeduceArgs(Base<Args...>*) -> DeduceArgs<Args...>;

template <class T>
constexpr bool always_false = false;

#include <utility>

template <class T,class U = typename
decltype(DeduceArgs{std::declval<T*>()})::type>
class Deleter
{
    static_assert(always_false<T>);
};

template <class Derived,class...Args>
class Deleter<Derived,Base<Args...>>
{
public:

    void operator()(Derived* pointer) const noexcept
    {
        delete pointer;
    }

};

#include <memory>

template <class T>
using IntrVarPtr = std::unique_ptr<T,Deleter<T>>;

int main()
{
    IntrVarPtr<Derived> ptr;
}


The error message I receive is:
<source>: In substitution of 'template<class T> using IntrVarPtr =
std::unique_ptr<T, Deleter<T> > [with T = Derived]':

<source>:54:23:   required from here

<source>:50:7: error: initializer for 'Base<int, double, float>' must be
brace-enclosed

   50 | using IntrVarPtr = std::unique_ptr<T,Deleter<T>>;

      |       ^~~~~~~~~~


Corresponding godbolt link: https://godbolt.org/z/eK8fex
  • [Bug c++/97661] New: Bogus er... markus.boeck02 at gmail dot com via Gcc-bugs

Reply via email to