/// Does this code expose a GCC bug?

#include <iostream>
#include <vector>
using namespace std;

#define SHOW_BUG
template <typename Derived>
struct Base
{
        template <typename T>
#ifdef SHOW_BUG
                void push_back(T& t)
#else
                void push_back2(T& t)
#endif
                {
                        static_cast<Derived*>(this)->push_back(t);
                }
};

struct P : public Base<P>, protected vector<int>
{
        friend class Base<P>;
        vector<int> v;
};



int main()
{
        int i=10;
        P p;

#ifdef SHOW_BUG
        p.push_back(i);
#else
        p.push_back2(i);
#endif
        return 0;
}