#include <cassert>
#include <climits>
#include <memory>
template<class T>
class access_token
{
private:
access_token();
friend T;
};
// GCC bug: "= default" inside class body makes this function public.
template<class T>
access_token<T>::access_token() = default;
class widget
{
public:
widget(access_token<widget>, int const x) : x_(x) {}
private:
// Earlier GCC bug doesn't happen for these functions. /shrug
widget(widget const&) = default;
widget(widget&&) = default;
widget& operator=(widget const&) & = default;
widget& operator=(widget&&) & = default;
public:
static std::shared_ptr<widget> create();
private:
int x_;
};
std::shared_ptr<widget> widget::create()
{
static int x = 0;
assert(INT_MAX != x && "Signed integer overflow");
++x;
return std::make_shared<widget>(access_token<widget>(), x);
}
int main()
{
auto const p = widget::create();
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8bWVtb3J5PgoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgYWNjZXNzX3Rva2VuCnsKcHJpdmF0ZToKCWFjY2Vzc190b2tlbigpOwoKCWZyaWVuZCBUOwp9OwoKLy8gR0NDIGJ1ZzogIj0gZGVmYXVsdCIgaW5zaWRlIGNsYXNzIGJvZHkgbWFrZXMgdGhpcyBmdW5jdGlvbiBwdWJsaWMuCnRlbXBsYXRlPGNsYXNzIFQ+CmFjY2Vzc190b2tlbjxUPjo6YWNjZXNzX3Rva2VuKCkgPSBkZWZhdWx0OwoKY2xhc3Mgd2lkZ2V0CnsKcHVibGljOgoJd2lkZ2V0KGFjY2Vzc190b2tlbjx3aWRnZXQ+LCBpbnQgY29uc3QgeCkgOiB4Xyh4KSB7fQoKcHJpdmF0ZToKCS8vIEVhcmxpZXIgR0NDIGJ1ZyBkb2Vzbid0IGhhcHBlbiBmb3IgdGhlc2UgZnVuY3Rpb25zLiAvc2hydWcKICAgIHdpZGdldCh3aWRnZXQgY29uc3QmKSA9IGRlZmF1bHQ7CiAgICB3aWRnZXQod2lkZ2V0JiYpID0gZGVmYXVsdDsKICAgIHdpZGdldCYgb3BlcmF0b3I9KHdpZGdldCBjb25zdCYpICYgPSBkZWZhdWx0OwogICAgd2lkZ2V0JiBvcGVyYXRvcj0od2lkZ2V0JiYpICYgPSBkZWZhdWx0OwoKcHVibGljOgoJc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjx3aWRnZXQ+IGNyZWF0ZSgpOwoKcHJpdmF0ZToKCWludCB4XzsKfTsKCnN0ZDo6c2hhcmVkX3B0cjx3aWRnZXQ+IHdpZGdldDo6Y3JlYXRlKCkKewoJc3RhdGljIGludCB4ID0gMDsKCWFzc2VydChJTlRfTUFYICE9IHggJiYgIlNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93Iik7CgkrK3g7CglyZXR1cm4gc3RkOjptYWtlX3NoYXJlZDx3aWRnZXQ+KGFjY2Vzc190b2tlbjx3aWRnZXQ+KCksIHgpOwp9CgppbnQgbWFpbigpCnsKCWF1dG8gY29uc3QgcCA9IHdpZGdldDo6Y3JlYXRlKCk7Cn0K