1 /* { dg-do compile } */
2 /* { dg-options "-std=c++14 -O -fdump-tree-dse1-details" } */
4 using uint = unsigned int;
6 template<typename C, uint S>
21 OutBuf(FixBuf<C, S>& b) : cur{b.buf}, end{b.buf + S}, beg{b.buf} { }
23 OutBuf(C* b, C* e) : cur{b}, end{e} { }
24 OutBuf(C* b, uint s) : cur{b}, end{b + s} { }
27 OutBuf& operator<<(C v)
37 OutBuf& operator<<(uint v)
44 *this << static_cast<C>(r + '0');
52 template<typename C, uint S>
53 static constexpr auto Select(FixBuf<C, S>& fb, OutBuf<C>&)
60 struct BufOrSize<true>
62 template<typename C, uint S>
63 static constexpr auto Select(FixBuf<C, S>&, OutBuf<C>& ob)
65 return ob.cur - ob.beg;
69 // if BOS=1, it will return the size of the generated data, else the data itself
70 template<uint N, uint S, bool BOS = 0>
76 for (uint i = 0; i <= N; ++i) {
77 ob << i << static_cast<char>(i == N ? 0 : ' ');
79 return BufOrSize<BOS>::Select(fb, ob);
84 constexpr auto x = fixbuf<13, 200>();
90 constexpr auto s = fixbuf<13, 0, 1>();
91 constexpr auto x = fixbuf<13, s>();
100 /* { dg-final { scan-tree-dump-times "MEM\\\[\\(struct FixBuf \\*\\)&<retval> \\+ \[0-9\]+B\\\] = {}" 1 "dse1" } } */