// { dg-do compile }
// { dg-options "-g -Wno-return-type" }

typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;
namespace mpl_ {
    template< typename T, T N > struct integral_c {
	static const T value = N;
    };
}
namespace mpl {
    using namespace mpl_;
};
template <class T, T val> struct integral_constant : public mpl::integral_c<T, val> {
    typedef integral_constant<bool,false> type;
};
template< typename T > struct is_lvalue_reference : public ::integral_constant<bool,false> {
};
template< typename T > struct is_rvalue_reference : public ::integral_constant<bool,false> {
};
namespace type_traits {
    template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false> struct ice_or;
    template <> struct ice_or<false, false, false, false, false, false, false> {
	static const bool value = false;
    };
}
template <typename T> struct is_reference_impl {
    static const bool value = (::type_traits::ice_or< ::is_lvalue_reference<T>::value, ::is_rvalue_reference<T>::value >::value)                  ;
};
template< typename T > struct is_reference : public ::integral_constant<bool,::is_reference_impl<T>::value> {
};
struct na {
};
namespace mpl {
    template<       bool C     , typename T1     , typename T2     > struct if_c {
	typedef T2 type;
    };
    template<       typename T1 = na     , typename T2 = na     , typename T3 = na     > struct if_ {
	typedef if_c<           static_cast<bool>(T1::value)         , T2         , T3         > almost_type_;
	typedef typename almost_type_::type type;
    };
}
namespace optional_detail {
    template<class T> struct types_when_isnt_ref {
	typedef T & reference_type ;
    }
    ;
    template<class T> struct types_when_is_ref {
    }
    ;
    struct optional_tag {
    }
    ;
    template<class T> class optional_base : public optional_tag {
	typedef types_when_isnt_ref<T> types_when_not_ref ;
	typedef types_when_is_ref<T> types_when_ref ;
    protected :
	typedef typename is_reference<T>::type is_reference_predicate ;
	typedef typename mpl::if_<is_reference_predicate,types_when_ref,types_when_not_ref>::type types ;
	typedef typename types::reference_type reference_type ;
    }
    ;
}
template<class T> class optional : public optional_detail::optional_base<T> {
    typedef optional_detail::optional_base<T> base ;
public :
    typedef typename base::reference_type reference_type ;
    reference_type operator *() {
    }
};
namespace noncopyable_ {
    class noncopyable   {
    };
}
typedef noncopyable_::noncopyable noncopyable;
template<class T> class shared_ptr {
public:
    T * operator-> () const     {
    }
};
typedef uint64_t block_address;
class transaction_manager : noncopyable {
public:
    typedef shared_ptr<transaction_manager> ptr;
};
template <typename ValueType>  class NoOpRefCounter {
};
struct uint64_traits {
};
namespace btree_detail {
    class shadow_spine : private noncopyable {
    public:
	shadow_spine(transaction_manager::ptr tm)     : tm_(tm) {
	}
	transaction_manager::ptr tm_;
    };
}
template <unsigned Levels, typename ValueTraits>  class btree {
public:
    typedef shared_ptr<btree<Levels, ValueTraits> > ptr;
    typedef uint64_t key[Levels];
    typedef typename ValueTraits::value_type value_type;
    typedef optional<value_type> maybe_value;
    btree(typename transaction_manager::ptr tm,         typename ValueTraits::ref_counter rc);
    maybe_value lookup(key const &key) const;
    void insert(key const &key, typename ValueTraits::value_type const &value);
    template <typename ValueTraits2>   bool   insert_location(btree_detail::shadow_spine &spine,     block_address block,     uint64_t key,     int *index);
    typename transaction_manager::ptr tm_;
    block_address root_;
    typename ValueTraits::ref_counter rc_;
};
template <unsigned Levels, typename ValueTraits> void btree<Levels, ValueTraits>:: insert(key const &key,        typename ValueTraits::value_type const &value) {
    using namespace btree_detail;
    block_address block = root_;
    int index = 0;
    shadow_spine spine(tm_);
    for (unsigned level = 0;
	 level < Levels - 1;
	 ++level) {
	bool need_insert = insert_location<uint64_traits>(spine, block, key[level], &index);
	if (need_insert) {
	    btree<Levels - 1, ValueTraits> new_tree(tm_, rc_);
	}
    }
}
struct device_details_disk {
}
__attribute__ ((packed));
struct device_details {
};
struct device_details_traits {
    typedef device_details value_type;
    typedef NoOpRefCounter<device_details> ref_counter;
};
typedef uint32_t thin_dev_t;
typedef btree<1, device_details_traits> detail_tree;
struct metadata {
    typedef shared_ptr<metadata> ptr;
    detail_tree::ptr details_;
};
class thin_pool;
class thin {
    void set_snapshot_time(uint32_t time);
    thin_dev_t dev_;
    thin_pool *pool_;
};
class thin_pool {
public:
    metadata::ptr md_;
};
void thin::set_snapshot_time(uint32_t time) {
    uint64_t key[1] = {
	dev_ };
    optional<device_details> mdetail = pool_->md_->details_->lookup(key);
    pool_->md_->details_->insert(key, *mdetail);
}
