http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50013

           Summary: Internal compiler error: Error reporting routines
                    re-entered using decltype
           Product: gcc
           Version: 4.5.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: fabian.bergm...@gmail.com


namespace functor
{
    template <class ret,class fparam,class... param>
    class Functor
    {
        public:
            virtual ret exec(fparam,param...) = 0;
    };

    template<class ret>
    class Functor<ret,void>
    {
        public:
            virtual ret exec(void) = 0;
    };

    template <class ret,class type,class fparam,class... param>
    class Function : public Functor<ret,fparam,param...>
    {
        public:
            Function(ret(type::*f)(fparam,param...),type* t) : obj(t), func(f)
            {
            }

            virtual ret exec(fparam fp,param... p)
            {
                return (obj->*func)(fp, p...);
            }

        protected:
            type* obj;
            ret(type::*func)(fparam,param...);
    };

    template<class ret,class type>
    class Function <ret,type,void> : public Functor<ret,void>
    {
        public:
        template<typename...>
            class Default;
        public:
            Function(ret(type::*f)(void), type* t) : obj(t), func(f)
            {
            }

            virtual ret exec()
            {
                return (obj->*func)();
            }
        protected:
            type* obj;
            ret(type::*func)(void);
    };

    template<typename ret, typename type>
    template<typename fdefault>
    class Function<ret, type, void>::Default<fdefault> : public Functor<ret,
void>, public Function<ret, type, fdefault>
    {
        public:
            Default(decltype(Function<ret, type, fdefault>::func) f, type* t,
fdefault fd) : Function<ret, type, fdefault>(f, t), save(fd)
            {

            }

            virtual ret exec()
            {
                return (obj->*func)(save);
            }
        protected:
            fdefault save;
    };
}

class Test
{
    public:
        void test(int) {};
};

int main()
{
    Test test;
    functor::Function<void,Test,void>::Default<int>(&Test::test, &test, 10);
}

fabian@ubuntu:~$ g++ test.cpp -o test -std=c++0x
test.cpp: In instantiation of ‘functor::Function<void, Test,
void>::Default<int>’:
test.cpp:83:72:   instantiated from here
test.cpp:32:36: error: ‘void (Test::* functor::Function<void, Test,
int>::func)(int)’ is protected
test.cpp:60:4: error: within this context
test.cpp:32:36: error: ‘void (Test::* functor::Function<void, Test,
int>::func)(int)’ is protected
test.cpp:60:58: error: within this context

Internal compiler error: Error reporting routines re-entered.
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.5/README.Bugs> for instructions.

If someone could explain if test.cpp:60 really is an error and if so, how to do
it instead, I would be very grateful.

Reply via email to