A template parameter is provided by a function call parameter (which should be
rejected as it is non-constant).
The ICE does not occur (and an appropriate error is issued) if the code is
rewritten so that func is an int or a pointer to a non-member function.


class Object
{
public:
    void something()
    {
    }
};

template<typename F, F func>
class Action
{
public:
    // Removing "virtual" prevents the error.
    virtual void run()
    {
        // Removing the next line prevents the error.
        (object->*func)();
    }

    Object *object;
};

template<typename F>
void *make_action(F func)
{
    // Replacing func with &Object::something prevents the error.
    return new Action<F, func>();
}

void bug()
{
    make_action(&Object::something);

    // Not using the templated function prevents the error:
    //new Action<typeof(&Object::something), &Object::something>();
}


-- 
           Summary: ICE on virtual function in template with pointer-to-
                    member-function template parameter
           Product: gcc
           Version: 4.1.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: circuitben at gmail dot com
 GCC build triplet: i486-linux-gnu
  GCC host triplet: i486-linux-gnu
GCC target triplet: i486-linux-gnu


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

Reply via email to