blob: 75c5c593eead7ecb0eed7ce4b8eee1f927c31c12 [file] [log] [blame]
/*
TEST_OUTPUT:
---
fail_compilation/test8556.d(24): Error: template instance `test8556.Grab!(Circle!(uint[]))` does not match template declaration `Grab(Range)`
with `Range = Circle!(uint[])`
must satisfy the following constraint:
` !isSliceable!Range`
fail_compilation/test8556.d(55): Error: template instance `test8556.grab!(Circle!(uint[]))` error instantiating
---
*/
extern(C) int printf(const char*, ...);
template isSliceable(R)
{
enum bool isSliceable = is(typeof( R.init[1 .. 2] ));
}
struct Grab(Range) if (!isSliceable!Range)
{
public Range source;
}
Grab!R grab(R)(R input)
{
return Grab!R(input);
}
// 3. evaluate isSliceable in template constraint
auto grabExactly(R)(R range) if (!isSliceable!R) { return 0; }
auto grabExactly(R)(R range) if ( isSliceable!R) { return 0; }
struct Circle(Range)
{
// 2. auto return opSlice
auto opSlice(size_t i, size_t j)
{
//pragma(msg, typeof(opSlice)); // prints "fwdref err" with B, but doesn't with A
printf("%d %d\n", cast(int)i, cast(int)j);
assert(j >= i);
// 1. grabExactly curcular refers this opSlice.
return grabExactly(typeof(this)()); // broken execution with A
}
}
Circle!R circle(R)()
{
return Circle!R();
}
void main()
{
auto t = grab(circle!(uint[])());
auto cx = circle!(uint[])();
auto slice = cx[23 .. 33];
}