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